perm filename LISP.RPG[S,DOC]10 blob
sn#654906 filedate 1982-04-16 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00236 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00037 00002 **DRAFT** The Language **DRAFT**
C00039 00003 **DRAFT** General Information **DRAFT**
C00044 00004 **DRAFT** Maclisp Reference Manual **DRAFT**
C00047 00005 **DRAFT** General Information **DRAFT**
C00051 00006 **DRAFT** Maclisp Reference Manual **DRAFT**
C00055 00007 **DRAFT** General Information **DRAFT**
C00058 00008 **DRAFT** Maclisp Reference Manual **DRAFT**
C00059 00009 **DRAFT** Data Objects **DRAFT**
C00064 00010 **DRAFT** Maclisp Reference Manual **DRAFT**
C00069 00011 **DRAFT** Data Objects **DRAFT**
C00074 00012 **DRAFT** Maclisp Reference Manual **DRAFT**
C00078 00013 **DRAFT** Data Objects **DRAFT**
C00080 00014 **DRAFT** Maclisp Reference Manual **DRAFT**
C00081 00015 **DRAFT** The Basic Actions of LISP **DRAFT**
C00086 00016 **DRAFT** Maclisp Reference Manual **DRAFT**
C00090 00017 **DRAFT** The Basic Actions of LISP **DRAFT**
C00095 00018 **DRAFT** Maclisp Reference Manual **DRAFT**
C00098 00019 **DRAFT** The Basic Actions of LISP **DRAFT**
C00102 00020 **DRAFT** Maclisp Reference Manual **DRAFT**
C00106 00021 **DRAFT** The Basic Actions of LISP **DRAFT**
C00110 00022 **DRAFT** Maclisp Reference Manual **DRAFT**
C00113 00023 **DRAFT** The Basic Actions of LISP **DRAFT**
C00117 00024 **DRAFT** Maclisp Reference Manual **DRAFT**
C00120 00025 **DRAFT** The Basic Actions of LISP **DRAFT**
C00122 00026 **DRAFT** Maclisp Reference Manual **DRAFT**
C00125 00027 **DRAFT** Function Descriptions **DRAFT**
C00130 00028 **DRAFT** Maclisp Reference Manual **DRAFT**
C00131 00029 **DRAFT** Predicates **DRAFT**
C00134 00030 **DRAFT** Maclisp Reference Manual **DRAFT**
C00137 00031 **DRAFT** Predicates **DRAFT**
C00141 00032 **DRAFT** Maclisp Reference Manual **DRAFT**
C00144 00033 **DRAFT** Predicates **DRAFT**
C00145 00034 **DRAFT** Maclisp Reference Manual **DRAFT**
C00146 00035 **DRAFT** The Evaluator **DRAFT**
C00149 00036 **DRAFT** Maclisp Reference Manual **DRAFT**
C00153 00037 **DRAFT** The Evaluator **DRAFT**
C00157 00038 **DRAFT** Maclisp Reference Manual **DRAFT**
C00160 00039 **DRAFT** The Evaluator **DRAFT**
C00164 00040 **DRAFT** Maclisp Reference Manual **DRAFT**
C00167 00041 **DRAFT** The Evaluator **DRAFT**
C00170 00042 **DRAFT** Maclisp Reference Manual **DRAFT**
C00172 00043 **DRAFT** Manipulating List Structure **DRAFT**
C00175 00044 **DRAFT** Maclisp Reference Manual **DRAFT**
C00178 00045 **DRAFT** Manipulating List Structure **DRAFT**
C00180 00046 **DRAFT** Maclisp Reference Manual **DRAFT**
C00183 00047 **DRAFT** Manipulating List Structure **DRAFT**
C00186 00048 **DRAFT** Maclisp Reference Manual **DRAFT**
C00189 00049 **DRAFT** Manipulating List Structure **DRAFT**
C00192 00050 **DRAFT** Maclisp Reference Manual **DRAFT**
C00193 00051 **DRAFT** Manipulating List Structure **DRAFT**
C00196 00052 **DRAFT** Maclisp Reference Manual **DRAFT**
C00200 00053 **DRAFT** Manipulating List Structure **DRAFT**
C00204 00054 **DRAFT** Maclisp Reference Manual **DRAFT**
C00207 00055 **DRAFT** Manipulating List Structure **DRAFT**
C00210 00056 **DRAFT** Maclisp Reference Manual **DRAFT**
C00213 00057 **DRAFT** Manipulating List Structure **DRAFT**
C00216 00058 **DRAFT** Maclisp Reference Manual **DRAFT**
C00219 00059 **DRAFT** Manipulating List Structure **DRAFT**
C00223 00060 **DRAFT** Maclisp Reference Manual **DRAFT**
C00225 00061 **DRAFT** Manipulating List Structure **DRAFT**
C00229 00062 **DRAFT** Maclisp Reference Manual **DRAFT**
C00232 00063 **DRAFT** Flow of Control **DRAFT**
C00236 00064 **DRAFT** Maclisp Reference Manual **DRAFT**
C00239 00065 **DRAFT** Flow of Control **DRAFT**
C00243 00066 **DRAFT** Maclisp Reference Manual **DRAFT**
C00247 00067 **DRAFT** Flow of Control **DRAFT**
C00251 00068 **DRAFT** Maclisp Reference Manual **DRAFT**
C00256 00069 **DRAFT** Flow of Control **DRAFT**
C00259 00070 **DRAFT** Maclisp Reference Manual **DRAFT**
C00262 00071 **DRAFT** Flow of Control **DRAFT**
C00265 00072 **DRAFT** Maclisp Reference Manual **DRAFT**
C00268 00073 **DRAFT** Flow of Control **DRAFT**
C00270 00074 **DRAFT** Maclisp Reference Manual **DRAFT**
C00274 00075 **DRAFT** Flow of Control **DRAFT**
C00277 00076 **DRAFT** Maclisp Reference Manual **DRAFT**
C00278 00077 **DRAFT** Atomic Symbols **DRAFT**
C00282 00078 **DRAFT** Maclisp Reference Manual **DRAFT**
C00285 00079 **DRAFT** Atomic Symbols **DRAFT**
C00287 00080 **DRAFT** Maclisp Reference Manual **DRAFT**
C00291 00081 **DRAFT** Atomic Symbols **DRAFT**
C00303 00082 **DRAFT** Maclisp Reference Manual **DRAFT**
C00306 00083 **DRAFT** Atomic Symbols **DRAFT**
C00309 00084 **DRAFT** Maclisp Reference Manual **DRAFT**
C00312 00085 **DRAFT** Atomic Symbols **DRAFT**
C00314 00086 **DRAFT** Maclisp Reference Manual **DRAFT**
C00318 00087 **DRAFT** Atomic Symbols **DRAFT**
C00322 00088 **DRAFT** Maclisp Reference Manual **DRAFT**
C00323 00089 **DRAFT** Atomic Symbols **DRAFT**
C00326 00090 **DRAFT** Maclisp Reference Manual **DRAFT**
C00330 00091 **DRAFT** Atomic Symbols **DRAFT**
C00333 00092 **DRAFT** Maclisp Reference Manual **DRAFT**
C00334 00093 **DRAFT** Numbers **DRAFT**
C00336 00094 **DRAFT** Maclisp Reference Manual **DRAFT**
C00338 00095 **DRAFT** Numbers **DRAFT**
C00341 00096 **DRAFT** Maclisp Reference Manual **DRAFT**
C00343 00097 **DRAFT** Numbers **DRAFT**
C00345 00098 **DRAFT** Maclisp Reference Manual **DRAFT**
C00347 00099 **DRAFT** Numbers **DRAFT**
C00350 00100 **DRAFT** Maclisp Reference Manual **DRAFT**
C00353 00101 **DRAFT** Numbers **DRAFT**
C00354 00102 **DRAFT** Maclisp Reference Manual **DRAFT**
C00357 00103 **DRAFT** Numbers **DRAFT**
C00360 00104 **DRAFT** Maclisp Reference Manual **DRAFT**
C00361 00105 **DRAFT** Numbers **DRAFT**
C00364 00106 **DRAFT** Maclisp Reference Manual **DRAFT**
C00366 00107 **DRAFT** Numbers **DRAFT**
C00368 00108 **DRAFT** Maclisp Reference Manual **DRAFT**
C00370 00109 **DRAFT** Numbers **DRAFT**
C00373 00110 **DRAFT** Maclisp Reference Manual **DRAFT**
C00376 00111 **DRAFT** Numbers **DRAFT**
C00379 00112 **DRAFT** Maclisp Reference Manual **DRAFT**
C00381 00113 **DRAFT** Character Manipulation **DRAFT**
C00384 00114 **DRAFT** Maclisp Reference Manual **DRAFT**
C00388 00115 **DRAFT** Character Manipulation **DRAFT**
C00391 00116 **DRAFT** Maclisp Reference Manual **DRAFT**
C00392 00117 **DRAFT** Character Manipulation **DRAFT**
C00395 00118 **DRAFT** Maclisp Reference Manual **DRAFT**
C00397 00119 **DRAFT** Arrays **DRAFT**
C00402 00120 **DRAFT** Maclisp Reference Manual **DRAFT**
C00407 00121 **DRAFT** Arrays **DRAFT**
C00412 00122 **DRAFT** Maclisp Reference Manual **DRAFT**
C00415 00123 **DRAFT** Arrays **DRAFT**
C00419 00124 **DRAFT** Maclisp Reference Manual **DRAFT**
C00423 00125 **DRAFT** Arrays **DRAFT**
C00427 00126 **DRAFT** Maclisp Reference Manual **DRAFT**
C00428 00127 **DRAFT** Mapping Functions **DRAFT**
C00432 00128 **DRAFT** Maclisp Reference Manual **DRAFT**
C00435 00129 **DRAFT** Mapping Functions **DRAFT**
C00439 00130 **DRAFT** Maclisp Reference Manual **DRAFT**
C00440 00131 **DRAFT** The System **DRAFT**
C00445 00132 **DRAFT** The System **DRAFT**
C00446 00133 **DRAFT** Maclisp Reference Manual **DRAFT**
C00450 00134 **DRAFT** The System **DRAFT**
C00454 00135 **DRAFT** Maclisp Reference Manual **DRAFT**
C00456 00136 **DRAFT** The System **DRAFT**
C00461 00137 **DRAFT** Maclisp Reference Manual **DRAFT**
C00463 00138 **DRAFT** The System **DRAFT**
C00466 00139 **DRAFT** Maclisp Reference Manual **DRAFT**
C00470 00140 **DRAFT** The System **DRAFT**
C00475 00141 **DRAFT** Maclisp Reference Manual **DRAFT**
C00479 00142 **DRAFT** The System **DRAFT**
C00484 00143 **DRAFT** Maclisp Reference Manual **DRAFT**
C00488 00144 **DRAFT** The System **DRAFT**
C00491 00145 **DRAFT** Maclisp Reference Manual **DRAFT**
C00493 00146 **DRAFT** The System **DRAFT**
C00498 00147 **DRAFT** Maclisp Reference Manual **DRAFT**
C00503 00148 **DRAFT** The System **DRAFT**
C00508 00149 **DRAFT** Maclisp Reference Manual **DRAFT**
C00512 00150 **DRAFT** The System **DRAFT**
C00516 00151 **DRAFT** Maclisp Reference Manual **DRAFT**
C00521 00152 **DRAFT** The System **DRAFT**
C00525 00153 **DRAFT** Maclisp Reference Manual **DRAFT**
C00529 00154 **DRAFT** The System **DRAFT**
C00533 00155 **DRAFT** Maclisp Reference Manual **DRAFT**
C00537 00156 **DRAFT** The System **DRAFT**
C00541 00157 **DRAFT** Maclisp Reference Manual **DRAFT**
C00546 00158 **DRAFT** The System **DRAFT**
C00548 00159 **DRAFT** Maclisp Reference Manual **DRAFT**
C00552 00160 **DRAFT** The System **DRAFT**
C00556 00161 **DRAFT** Maclisp Reference Manual **DRAFT**
C00560 00162 **DRAFT** The System **DRAFT**
C00564 00163 **DRAFT** Maclisp Reference Manual **DRAFT**
C00569 00164 **DRAFT** The System **DRAFT**
C00573 00165 **DRAFT** Maclisp Reference Manual **DRAFT**
C00575 00166 **DRAFT** The System **DRAFT**
C00579 00167 **DRAFT** Maclisp Reference Manual **DRAFT**
C00584 00168 **DRAFT** The System **DRAFT**
C00587 00169 **DRAFT** Maclisp Reference Manual **DRAFT**
C00591 00170 **DRAFT** The System **DRAFT**
C00593 00171 **DRAFT** Maclisp Reference Manual **DRAFT**
C00596 00172 **DRAFT** The System **DRAFT**
C00600 00173 **DRAFT** Maclisp Reference Manual **DRAFT**
C00604 00174 **DRAFT** The System **DRAFT**
C00608 00175 **DRAFT** Maclisp Reference Manual **DRAFT**
C00613 00176 **DRAFT** The System **DRAFT**
C00618 00177 **DRAFT** Maclisp Reference Manual **DRAFT**
C00622 00178 **DRAFT** The System **DRAFT**
C00626 00179 **DRAFT** Maclisp Reference Manual **DRAFT**
C00631 00180 **DRAFT** The System **DRAFT**
C00636 00181 **DRAFT** Maclisp Reference Manual **DRAFT**
C00641 00182 **DRAFT** The System **DRAFT**
C00645 00183 **DRAFT** Maclisp Reference Manual **DRAFT**
C00650 00184 **DRAFT** The System **DRAFT**
C00655 00185 **DRAFT** Maclisp Reference Manual **DRAFT**
C00659 00186 **DRAFT** The System **DRAFT**
C00664 00187 **DRAFT** Maclisp Reference Manual **DRAFT**
C00668 00188 **DRAFT** The System **DRAFT**
C00670 00189 **DRAFT** Maclisp Reference Manual **DRAFT**
C00674 00190 **DRAFT** The System **DRAFT**
C00676 00191 **DRAFT** Maclisp Reference Manual **DRAFT**
C00680 00192 **DRAFT** The System **DRAFT**
C00684 00193 **DRAFT** Maclisp Reference Manual **DRAFT**
C00687 00194 **DRAFT** The System **DRAFT**
C00692 00195 **DRAFT** Maclisp Reference Manual **DRAFT**
C00697 00196 **DRAFT** The System **DRAFT**
C00701 00197 **DRAFT** Maclisp Reference Manual **DRAFT**
C00706 00198 **DRAFT** The System **DRAFT**
C00711 00199 **DRAFT** Maclisp Reference Manual **DRAFT**
C00712 00200 **DRAFT** The System **DRAFT**
C00716 00201 **DRAFT** Maclisp Reference Manual **DRAFT**
C00721 00202 **DRAFT** The System **DRAFT**
C00725 00203 **DRAFT** Maclisp Reference Manual **DRAFT**
C00728 00204 **DRAFT** The System **DRAFT**
C00732 00205 **DRAFT** Maclisp Reference Manual **DRAFT**
C00736 00206 **DRAFT** The System **DRAFT**
C00740 00207 **DRAFT** Maclisp Reference Manual **DRAFT**
C00745 00208 **DRAFT** The System **DRAFT**
C00750 00209 **DRAFT** Maclisp Reference Manual **DRAFT**
C00754 00210 **DRAFT** The System **DRAFT**
C00758 00211 **DRAFT** Maclisp Reference Manual **DRAFT**
C00764 00212 **DRAFT** The System **DRAFT**
C00769 00213 **DRAFT** Maclisp Reference Manual **DRAFT**
C00773 00214 **DRAFT** The System **DRAFT**
C00778 00215 **DRAFT** Maclisp Reference Manual **DRAFT**
C00782 00216 **DRAFT** The System **DRAFT**
C00787 00217 **DRAFT** Maclisp Reference Manual **DRAFT**
C00791 00218 **DRAFT** The System **DRAFT**
C00795 00219 **DRAFT** Maclisp Reference Manual **DRAFT**
C00799 00220 **DRAFT** The System **DRAFT**
C00803 00221 **DRAFT** Maclisp Reference Manual **DRAFT**
C00807 00222 **DRAFT** The System **DRAFT**
C00812 00223 **DRAFT** Maclisp Reference Manual **DRAFT**
C00817 00224 **DRAFT** The System **DRAFT**
C00821 00225 **DRAFT** Maclisp Reference Manual **DRAFT**
C00824 00226 **DRAFT** The System **DRAFT**
C00828 00227 **DRAFT** Maclisp Reference Manual **DRAFT**
C00832 00228 **DRAFT** The System **DRAFT**
C00836 00229 **DRAFT** Maclisp Reference Manual **DRAFT**
C00840 00230 **DRAFT** The System **DRAFT**
C00843 00231 **DRAFT** Maclisp Reference Manual **DRAFT**
C00846 00232 **DRAFT** The System **DRAFT**
C00849 00233 **DRAFT** Maclisp Reference Manual **DRAFT**
C00852 00234 **DRAFT** The System **DRAFT**
C00856 00235 **DRAFT** Maclisp Reference Manual **DRAFT**
C00858 00236 **DRAFT** Function Index **DRAFT**
C00867 ENDMK
C⊗;
**DRAFT** The Language **DRAFT**
Part 1 - The Language
Table of Contents
1. General Information . . . . . . . . . . . . . . . . . . . . . . . . 1-1
1.1 The Maclisp Language . . . . . . . . . . . . . . . . . . . . . . . . 1-1
1.2 Structure of the Manual . . . . . . . . . . . . . . . . . . . . . . 1-3
1.3 Notational Conventions . . . . . . . . . . . . . . . . . . . . . . . 1-4
2. Data Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-7
3. The Basic Actions of LISP . . . . . . . . . . . . . . . . . . . . .1-13
3.1 Binding of Variables . . . . . . . . . . . . . . . . . . . . . . . .1-13
3.2 Evaluation of Forms . . . . . . . . . . . . . . . . . . . . . . . .1-15
3.3 Application of Functions . . . . . . . . . . . . . . . . . . . . . .1-17
3.4 Special Forms . . . . . . . . . . . . . . . . . . . . . . . . . . .1-21
3.5 Binding Context Pointers . . . . . . . . . . . . . . . . . . . . . .1-24
December 5, 1977 Page 1-1
**DRAFT** General Information **DRAFT**
1. General Information
1.1 The Maclisp Language
Maclisp is a dialect of Lisp developed at M.I.T.'s Project MAC and M.I.T.'s
Artificial Intelligence Laboratory for use in artificial intelligence research
and related fields. Maclisp is descended from the commonly-known Lisp 1.5
dialect; however, many features of the language have been changed or augmented.
This document is intended both as a reference source for the language and as
a user's guide to three implementations. These are, in chronological order, the
M.I.T. Artificial Intelligence Lab's implementation on the DEC pdp-10 computer
under their operating system ITS, hereafter referred to as "the ITS
implementation," Project MAC's implementation on Honeywell's version of the
Multics system, hereafter referred to as "the Multics implementation," and the
version that runs on the DEC pdp-10 under DEC's TOPS-10 operating system,
hereafter called "the DEC-10 implementation." The DEC-10 implementation also
runs under TENEX by means of a TOPS-10 emulator. Since the ITS and DEC-10
implementations are closely related, they are sometimes referred to collectively
as the pdp-10 implementation. There are reputed to be several other
implementations.
These implementations are mostly compatible; however, some implementations
have extra features designed to exploit peculiar features of the system on which
they run, and some implementations are temporarily missing some features. Most
programs will work on any implementation, although it is possible to write
machine-dependent code if you try hard enough.
The Maclisp system is structured as an environment, which is essentially a
set of names and bindings of those names to data structures and function
definitions. The environment contains a large number of useful functions.
These functions can be used through an interpreter to define other functions, to
control the environment, to do useful work, etc.
The interpreter is the basic user interface to the system. This is how the
user enters "commands." When Maclisp is not doing anything else, such as running
a program, it waits for the user to enter a Lisp form. This form is evaluated
and the value is printed out. The form may call upon one of the system
December 5, 1977 ∪1-1. Page 1-1
**DRAFT** Maclisp Reference Manual **DRAFT**
functions (or a user-defined function, of course) to perform some useful task.
The evaluation of a form may initiate the execution of a large and complex
program, perhaps never returning to the "top level" interpreter, or it may
perform some simple action and immediately wait for the user to type another
form.
It is also possible to get into the interpreter while a program is running,
using the break facility. This is primarily used in debugging and related
programming activities.
The functions invoked by the top-level interpreter may be executable machine
programs, or they may themselves be interpreted. This is entirely a matter of
choice and convenience. The system functions are mostly machine programs. User
functions are usually first used interpretively. After they work, the compiler
may be applied to them, turning them into machine programs which can then be
loaded into the environment.
All of this is done within a single consistent language, Lisp, whose virtue
is that the data structure is simple and general enough that programs may easily
operate on programs, and that the program structure is simple and general enough
that it can be used as a command language.
Page 1-2 ∪1-1.1 December 5, 1977
**DRAFT** General Information **DRAFT**
1.2 Structure of the Manual
The manual is generally structured into sections on particular topics; each
section contains explanatory text and function definitions, interspersed. In
general, each section contains both elementary and complex material, with
complexity increasing toward the end of the section. An axiomatic, step-by-step
development is not used. Frequently the more complex information in a section
will assume knowledge from other sections which appear later in the manual. The
new user is advised to skip around, reading early chapters and early sections of
chapters first.
Often descriptions of Lisp functions will be given not only in prose but also
in terms of other Lisp functions. These are as accurate as possible, but should
not be taken too literally. Their main purpose is to serve as a source of
examples.
Accessing information in the manual is dependent on both the user's level of
ability and the purpose for which she or he is using the manual. Though cover
to cover reading is not recommended (though not excluded), it is suggested that
someone who has never previously seen this manual browse through it, touching
the beginning of each subdivision that is listed in the Table of Contents, in
order to familiarize himself or herself with the material that it contains. To
find an answer to some particular question, one must use one of the provided
access methods. Since the manual is structured by topics one can use the Table
of Contents that is found at the beginning of the manual, and the more detailed
tables of contents found at the beginning of each of the six major parts, to
find where information of a general class will be found. Entry into the manual
is also facilitated by the Glossary and the Concept Index, which are found at
the end. Also at the end of the manual are a Function Index and an Atomic
Symbol Index which are probably most useful to a regular and repeated user of
the dialect, or to an experienced user of another dialect, who wishes to find
out the answer to a question about a specific function. When one section of the
manual assumes knowledge of another section a page number reference to the other
section will generally be given.
December 5, 1977 ∪1-1.2 Page 1-3
**DRAFT** Maclisp Reference Manual **DRAFT**
1.3 Notational Conventions
There are some conventions of notation that must be mentioned at this time,
due to their being used in examples.
Most numbers are in octal radix (base eight). Numbers with a decimal point
and spelled-out numbers are in decimal radix. It is important to remember that
by default Maclisp inputs and outputs all numbers in octal radix. If you want
to change this, see the variables base and ibase.
A combination of the characters equal sign and greater than symbol, "=>",
will be used in examples of Lisp code to mean evaluation. For instance, "F =>
V" means that evaluating the form F produces the value V.
All uses of the phrase "Lisp reader," unless further qualified, refer to that
part of the Lisp system which reads input, and not to the person reading this
document.
The terms "S-expression" and "Lisp object" are synonyms for "any piece of
Lisp data."
The character "$" always stands for dollar-sign, never for "alt mode," unless
that is specifically stated.
The two characters accent acute, "'", and semi-colon, ";", are examples of
what are called macro characters. Though the macro character facility, which is
explained in Part 5, is not of immediate interest to a new user of the dialect,
these two macro characters come preset by the Lisp system and are useful. When
the Lisp reader encounters an accent acute, or quote mark, it reads in the next
S-expression and encloses it in a quote-form, which prevents evaluation of the
S-expression. That is:
'some-atom
turns into:
(quote some-atom)
and
'(cons 'a 'b)
Page 1-4 ∪1-1.3 December 5, 1977
**DRAFT** General Information **DRAFT**
turns into
(quote (cons (quote a) (quote b)))
The semi-colon (;) is used as a commenting character. When the Lisp reader
encounters it, the remainder of the line is discarded.
The term "newline" is used to refer to that character or sequence of
characters which indicates the end of a line. This is implementation dependent.
In Multics Maclisp, newline is the Multics newline character, octal 012. In ITS
Maclisp, newline is carriage return (octal 015), optionally followed by line
feed (octal 012.) In dec-10 Maclisp, newline is carriage return followed by
line feed.
All Lisp examples in this manual are written according to the case
conventions of the Multics implementation, which uses both upper and lower case
letters and spells the names of most system functions in lower case. Some
implementations of Maclisp use only upper case letters because they exist on
systems which are not, or have not always been, equipped with terminals capable
of generating and displaying the full ascii character set. However, these
implementations will accept input in lower case and translate it to upper case,
unless the user has explicitly said not to.
December 5, 1977 ∪1-1.3 Page 1-5
**DRAFT** Maclisp Reference Manual **DRAFT**
Page 1-6 ∪1-1.3 December 5, 1977
**DRAFT** Data Objects **DRAFT**
2. Data Objects
Lisp works with pieces of data called "objects" or "S-expressions." These can
be simple "atomic" objects or complex objects compounded out of other objects.
Functions, the basic units of a Lisp program, are also objects and may be
manipulated as data.
Objects come in several types. All types are manifest; that is, it is
possible for a program to tell what type an object is just by looking at the
object itself, so it is not necessary to declare the types of variables as in
some other languages. One can make declarations, however, in order to aid the
compiler in producing optimal code. (See part 4.2.)
It is important to know that Lisp represents objects as pointers, so that a
storage cell (a "variable") will hold any object, and the same object may be
held by several different storage cells. For example, the same identical object
may be a component of two different compound objects.
The data-types are divided into three broad classes: the atomic types, the
non-atomic types, and the composite types. Objects are divided into the same
three classes according to their type. Atomic objects are basic units which
cannot be broken down by ordinary chemical means (car and cdr), while non-atomic
objects are structures constructed out of other objects. Composite objects are
indivisible, atomic, entities which have other objects associated with them.
These other objects may be examined and replaced.
The atomic data types are numbers, atomic symbols, strings, and subr-objects.
Atomic symbols can also be regarded as composite. See below.
In Lisp numbers can be represented by three types of atomic objects: fixnums,
flonums, and bignums. A fixnum is a fixed-point binary integer whose range of
values is machine-dependent. A flonum is a floating-point number whose
precision and range of values are machine-dependent. A bignum is an infinite-
precision integer. It is impossible to get "overflow" in bignum arithmetic, as
any integer can be represented by a bignum. However, fixnum and flonum
arithmetic is faster than bignum arithmetic and requires less memory. Sometimes
the word "fixnum" is used to include both fixnums and bignums (i.e. all
integers); in this manual, however, the word "fixnum" will never be used to
include bignums unless that is explicitly stated.
December 5, 1977 ∪1-2. Page 1-7
**DRAFT** Maclisp Reference Manual **DRAFT**
The printed representations for numbers are as follows: a fixnum is
represented as a sequence of digits in a specified base, usually octal. A
trailing decimal point indicates a decimal base. A flonum is represented as a
set of digits containing an embedded or leading decimal point and/or a trailing
exponent. The exponent is introduced by an upper or lower case "e". A bignum
looks like a fixnum except that it has enough digits that it will not fit within
the range available to fixnums. Any number may be preceded by a + or - sign.
Some examples of fixnums are 4, -1232, -191., +46. An example of a bignum is
1565656565656565656565656565656565. Some examples of flonums are: 4.0, .01,
-6e5, 4.2e-1.
One of the most important Lisp data types is the atomic symbol. In fact, the
word "atom" is often used to mean just atomic symbols, and not the other atomic
types. An atomic symbol has associated with it a name, a value, and possibly a
list of "properties". The name is a sequence of characters, which is the
printed representation of the atomic symbol. This name is often called the
"pname," or "print-name." A pname may contain any ascii character except the
full character, which causes trouble in some implementations. For example, a
certain atomic symbol would be represented externally as foo; internally as a
structure containing the value, the pname "foo", and the properties.
There are two special atomic symbols, t and nil. These always have their
respective selves as values and their values may not be changed. nil is used as
a "marker" in many contexts; it is essential to the construction of data
structures such as lists. t is usually used when an antithesis to nil is
required for some purpose, e.g. to represent the logical conditions "true" and
"false." Another property of the special atomic symbol nil is that its car and
its cdr are always nil.
The value of an atomic symbol can be any object of any type. There are
functions to set and get the value of a symbol. Because atomic symbols have
values associated with them, they can be used as variables in programs and as
"dummy arguments" in functions. It is also possible for an atomic symbol to
have no value, in which case it is said to be "undefined" or "unbound."
The property list of an atomic symbol is explained on page 2-52. It is used
for such things as recording the fact that an atomic symbol is the name of a
function.
An atomic symbol with one or no characters in its pname is often called a
"character object" and used to represent an ascii character. The atomic symbol
with a zero-length pname represents the ascii null character, and the symbols
Page 1-8 ∪1-2. December 5, 1977
**DRAFT** Data Objects **DRAFT**
with one-character pnames represent the character which is their pname.
Functions which take character objects as input usually also accept a string one
character long or a fixnum equal to the ascii-code value for the character.
Character objects are always interned on the obarray (see page 2-58).
Another Lisp data type is the string. This is a sequence of characters
(possibly zero-length). Strings are used to hold messages to be typed out and
to manipulate text when the structure of the text is not appropriate for the use
of "list processing." The printed representation of a string is a sequence of
characters enclosed in double-quotes, e.g. "foo". If a " is to be included in
the string, it is written twice, e.g. "foo""bar" is foo"bar. In implementations
without strings, atomic symbols are used instead. The pdp-10 implementations
currently lack strings.
A "subr-object" is a special atomic data-type whose use is normally hidden in
the implementation. A subr-object represents executable machine code. The
functions built into the Lisp system are subr-objects, as are user functions
that have been compiled. A subr-object has no printed representation, so each
system function has an atomic symbol which serves as its name. The symbol has
the subr-object as a property.
One composite data type is the array. An array consists of a number of
cells, each of which may contain any Lisp object. The cells of an array are
accessed by subscripting; each cell is named by a tuple of integers. An array
may have one or more dimensions; the upper limit on the number of dimensions is
implementation-defined. An array is not always associated with an atomic symbol
which is its name. Rather, an array is always designated by an array-pointer,
which is a special kind of atomic Lisp object. Frequently, an array-pointer
will be placed on the property list of a symbol under the indicator array and
then that symbol will be used as the name of the array, since symbols can have
printed representation. See page 2-89 for an
explanation of how to create, use, and delete arrays.
Another composite data type is the file-object, which is described on part
5.3.
The sole non-atomic data type is the "cons." A cons is a structure
containing two components, called the "car" and the "cdr" for historical
reasons. (These are names of fields in an IBM 7094 machine word.) These two
components may be any Lisp object, even another cons (in fact, they could even
be the same cons). In this way complex structures can be built up out of simple
conses. Internally a cons is represented in a form similar to:
December 5, 1977 ∪1-2. Page 1-9
**DRAFT** Maclisp Reference Manual **DRAFT**
←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
| | |
| car | cdr |
←λ|←←←←←←←←←←←←←←←←←←λ|←←←←←←←←←←←←←←←←←←λ|
where the boxes represent cells of memory large enough to hold a pointer, and
"car" and "cdr" are two pointers to objects. The printed representation of a
cons is the "dotted-pair" notation (A . B) where A is the car and B is the cdr.
Another way to write the internal representation of a cons, which is more
convenient for large structures, is:
---λ> o -----> cdr
|
|
V
car
There are three Lisp functions associated with conses: cons, car, and cdr.
The function cons combines its two arguments into a cons; (1 . 2) can be
generated by evaluating (cons 1 2). The function car returns the car component
of its argument, and the function cdr returns the cdr component of its argument.
One type of structure, built out of conses, that is used quite often, is the
"list." A list is a row of objects, of arbitrary length. A list of three
things 1, 2, and 3 is constructed by (cons 1 (cons 2 (cons 3 nil))); nil is a
special atom that is used to mark the end of a list. The structure of a list
can be diagrammed as:
---λ> o ----> o ----> o ----> nil
| | |
| | |
V V V
1 2 3
From this it can be seen that the car of a list is its first element, that
the cdr of a list is a list of the elements after the first, and that the list
of no elements is the same as nil.
This list of 1, 2, and 3 could be represented in the dot-notation used for
conses as (1 . (2 . (3 . nil))). However, a more convenient notation for the
Page 1-10 ∪1-2. December 5, 1977
**DRAFT** Data Objects **DRAFT**
printed representation of lists has been defined: the "list-notation" (1 2 3).
It is also possible to have a hybrid of the two notations which is used for
structures which are almost a list except that they end in an atom other than
nil. For example, (A . (B . (C . D))) can be represented as (A B C . D).
A list not containing any elements is perfectly legal and frequently used.
This zero-length list is identified with the atom nil. It may be typed in as
either nil or ().
December 5, 1977 ∪1-2. Page 1-11
**DRAFT** Maclisp Reference Manual **DRAFT**
Page 1-12 ∪1-2. December 5, 1977
**DRAFT** The Basic Actions of LISP **DRAFT**
3. The Basic Actions of LISP
3.1 Binding of Variables
The basic primitives of programming in Lisp are variables, forms, and
functions. A variable is an atomic symbol which has a value associated with it;
the symbol is said to be bound to that value. The value may of course be any
Lisp object whatsoever. The atomic symbol acts simply as a name by which the
program may refer to the value while it is processing it.
This is similar to the concept of variables in other programming languages.
However, Lisp's concept of the scope of names is subtly different from that of
most "block-structured" languages. At a given moment, a variable may actually
have several bindings in existence. Only the most recent, or current binding,
can be used. When a new binding is created, the previous one is pushed onto a
stack. It will become accessible again when the binding which superseded it is
removed. Creation and removal of bindings is synchronized with subroutine
calling (and with certain special forms described below) so this mechanism
corresponds closely to the "local variables" concept of other programming
languages. However, Lisp considers that there is only one variable whose
binding changes, rather than several separate variables which happen to have the
same name. Any reference to a variable, even from outside the particular
program which gave it its current binding, gets the current binding and not one
determined by "scope rules." It is possible to simulate the other concept of
scope of names by using binding context pointers, which are described later (see
page 1-22).
Unlike many other languages, Lisp does not combine the concepts of name and
storage. Many languages associate with a variable (a name) a piece of storage
which can hold one object of a particular type, such as a floating point number.
The variable's value resides in this storage. It is then impossible for two
variables to really have "the same" value; one could have a copy of the value of
another but not the same identical object.
The situation in Lisp is quite different. Binding a variable to a value is
not copying the value into storage associated with that variable. Values exist
as separate objects in their own right and in their own storage. Binding is
simply an association between a variable and a value; consequently there is no
December 5, 1977 ∪1-3. Page 1-13
**DRAFT** Maclisp Reference Manual **DRAFT**
reason why two variables cannot have truly identical values. Similarly, erasing
the binding between a variable and its value does not destroy or throw away the
value; it simply breaks the association. Of course, if there is no other use
for the value the storage it occupies will eventually be reclaimed by the system
and put to more productive use.
Often these processes of creating a new binding of a variable to a value and
reverting to a previous binding are referred to as binding and unbinding the
variable, respectively.
A slightly different way of creating a binding between a variable and a value
is assignment. When a variable is bound to a value, the previous binding is
saved and can be restored, but when a variable has a value assigned to it, the
previous binding is not saved, but is simply replaced. Thus binding may be
regarded as creating a new level of usage of a variable, while assignment
switches a variable to a different value within the same level. For instance, a
subroutine or function may bind a variable to an initial value when it is
entered, and then proceed to make use of that variable, possibly assigning a
different value to it from time to time. The initial binding of the variable
establishes the (temporary) ownership of that variable by the subroutine.
Due to the subtlety of the distinction between binding and assignment, some
people have proposed that assignment be eliminated wherever possible. The
Maclisp do function can often be useful in this regard.
There are several program constructs by which a variable can be bound. These
will be explained after forms and functions have been introduced.
Page 1-14 ∪1-3.1 December 5, 1977
**DRAFT** The Basic Actions of LISP **DRAFT**
3.2 Evaluation of Forms
The process of "executing" a Lisp program consists of the evaluation of
forms. Evaluation takes a form and produces from it a value (any Lisp object),
according to a strict set of rules which might be regarded as the complete
semantics of Lisp.
If the form is atomic, it is evaluated in a way which depends on its data
type. An atomic symbol is a variable; it evaluates to the value to which it is
currently bound. If it is not bound, an error occurs. (See part 3.4.) A number
or a string is a literal constant; it evaluates to itself. The special atomic
symbols t and nil are also treated as constants. A constant can also be created
by use of the quote special form; the value of (quote x) is x.
If the form is a list, its first element specifies the operation to be
performed, and its remaining elements specify arguments to that operation. Non-
atomic forms come in two types: special forms, which include the necessary
programming operations such as assignment and conditionals, and function
references, in which the "operation" is a function which is applied to the
specified arguments. Thus functional composition is the method by which
programs are built up out of parts - as distinguished from composition of data
structures, for example. Lisp functions correspond closely to subroutines in
other programming languages.
A function may be either a primitive which is directly executable by the
machine, called a subr (short for "subroutine"), or a function defined by
composition of functions and special forms, called an expr (short for
"expression.") Most subrs are built in to the language, but it is possible for a
user to convert his exprs into subrs by using the compiler (see part 4.) This
gains speed and compactness at some cost in debugging features.
There is additional complexity because special forms are actually implemented
as if they were function references. There is a special type of subr called an
fsubr which is used for this purpose. An fsubr is permitted to make any
arbitrary interpretation of its argument specification list, instead of
following the standard procedure which is described below. It is also possible
to define a special form by an expr, which is then called a fexpr. Most of the
built-in special forms are handled specially by the compiler. They are compiled
as the appropriate code rather than as a call to the fsubr.
Other types of functions are lsubr, which is just a subr with a variable
December 5, 1977 ∪1-3.2 Page 1-15
**DRAFT** Maclisp Reference Manual **DRAFT**
number of arguments, lexpr, which is an expr with a variable number of
arguments, and macro, which is a type of special form whose result is not a
value, but another form; this allows a "transformational" type of semantics.
Consider the form
(F A1 A2 ... An)
The evaluator first examines F to see if it is a function which defines a
special form, i.e. an fsubr, a fexpr, or a macro. If so, F is consulted and it
decides how to produce a value. If not, F must be an ordinary function. The
sub-forms A1 through An are evaluated, producing n arguments, and then the
definition of F is applied to the arguments. (Application is described in the
following section.) This yields a result (some Lisp object), which is then taken
as the value of the form.
An atomic form of some random type, such as a subr-object, a file, or an
array-pointer, evaluates to something random, often itself; or else causes an
error depending on the convenience of the implementation. Note that an array-
pointer is different from an atomic symbol which happens to be the name of an
array; such an atomic symbol is evaluated the same as any other atomic symbol.
Page 1-16 ∪1-3.2 December 5, 1977
**DRAFT** The Basic Actions of LISP **DRAFT**
3.3 Application of Functions
When a non-atomic form is evaluated, the function specified by that form is
combined with the arguments specified by that form to produce a value. This
process is called application; the function is said to be applied to the
arguments.
The first step in application is to convert the function-specifier into a
functional expression (sometimes confusingly called a functional form.) A
functional expression is a Lisp object which is stylized so that Lisp can know
how to apply it to arguments. The rules for this conversion will be described
after the types of functional expressions have been explained.
There are basically two types of functional expression. A lambda-expression
is a functional expression which specifies some variables which are to be bound
to the arguments, and some forms which are to be evaluated. One would expect
the forms to depend on the variables. The value of the last form is used as the
value of the application of the lambda-expression. Any preceding forms are
present purely for their side-effects. A lambda-expression looks like:
(lambda (a b c d)
form1
form2
form3)
Here a, b, c, and d are the variables to be bound to the values of the
arguments, called the lambda-variables. If at a certain moment the current
binding of a was the one created by this lambda-expression, a would be said to
be lambda-bound. Clearly this lambda-expression is a function which accepts
four arguments. The application of the functional expression to four arguments
produces a value by evaluating form1, then form2, and then form3. The value of
form3 is the value of the whole form. For example, the value of the form
((lambda (a b) b) 3 4)
is 4. The functional expression used is a very simple one which accepts two
arguments and returns the second one.
If we grant the existence of a primitive addition operation, whose functional
expression may be designated by +, then the value of the form
December 5, 1977 ∪1-3.3 Page 1-17
**DRAFT** Maclisp Reference Manual **DRAFT**
((lambda (a b) (+ a b)) 3 4)
is 7. Actually,
(+ 3 4)
evaluates to the same thing.
The second basic type of functional expression is the subr, which is a
program directly executable by the machine. The arguments of the form are
conveyed to this program in a machine-dependent manner, it performs some
arbitrary computation, and it returns a result. The built in primitives of the
language are subrs, and the user may write lambda-expressions which make use of
these subrs to define his own functions. The compiler may be used to convert
user functions into subrs if extra efficiency is required.
It is extremely convenient to be able to assign names to functional
expressions. Otherwise the definition of a function would have to be written
out in full each time it was used, which would be impossibly cumbersome.
Lisp uses atomic symbols to name functions. The "property list" mechanism is
used to associate an atomic symbol with a functional expression. (See page 2-52
for an explanation of property lists.) Because the binding mechanism is not
used, it is possible for the same name to be used for both a variable and a
function with no conflict. Usually the defun special form is used to establish
the association between a function name and a functional expression.
Thus, the car of a form may be either a functional expression itself, or an
atomic symbol which names a functional expression. In the latter case, the name
of the "property" which associates the symbol with the expression gives
additional information:
A lambda-expression is normally placed under the expr property. This defines
an ordinary expr.
If a lambda-expression is placed under the fexpr property, it defines a
special form. In that case, the first lambda-variable is bound to the cdr of
the form being evaluated. For example, if foo is a fexpr, and (foo (a b) (c d))
is evaluated, then foo's lambda-variable would be bound to ((a b) (c d)). A
second lambda-variable may optionally be included in a fexpr. It will be bound
to a "binding context pointer" to the context of the evaluation of the form.
(See page 1-22 for the details of binding context pointers.)
Page 1-18 ∪1-3.3 December 5, 1977
**DRAFT** The Basic Actions of LISP **DRAFT**
If a lambda-expression with one lambda-variable is placed under the macro
property, it defines the "macro" special form mentioned above. The lambda-
expression is applied to the entire form, as a single argument, and the value is
a new form that is evaluated in place of the original form.
If a subr-object is placed under the subr property, it defines a subr. If a
subr-object is placed under the fsubr property, it defines a special form. A
subr-object under the lsubr property defines a subr which accepts varying
numbers of arguments.
There are some additional refinements. A lambda-expression which accepts
varying numbers of arguments, called a lexpr, looks as follows:
(lambda n
form1
form2)
The single, unparenthesized, lambda-variable n is bound to the number of
arguments. The function arg, described on page 2-12, may be used to obtain the
arguments.
Another property which resembles a functional property is the autoload
property. If Lisp encounters an autoload property while searching the property
list of a symbol for functional properties, it loads in the file of compiled
functions specified by the property, then searches the property list again.
Presumably the file would contain a definition for the function being applied,
and that definition would be found the second time through. In this way
packages of functions which are not always used can be present in the
environment only when needed.
An array may also be used as a function. The arguments are the subscripts
and the value is the contents of the selected cell of the array. An atomic
symbol with an array property appearing in the function position in a form
causes that array to be used.
If the function-specifier of a form doesn't meet any of the above tests, Lisp
evaluates it and tries again. In this way, "functional variables" and "computed
functions" can be used. However, it is better to use the funcall function.
(See page 2-13.)
There are some other cases of lesser importance:
December 5, 1977 ∪1-3.3 Page 1-19
**DRAFT** Maclisp Reference Manual **DRAFT**
There is an obscure type of functional expression called a label-expression.
It looks like
(label name (lambda (...) ...))
The atomic symbol name is bound to the enclosed lambda-expression for the
duration of the application of the label-expression. Thus if name is used as a
functional variable this temporary definition will be used. This is mostly of
historical interest and is rarely used in actual programming.
Another type of functional expression is the funarg. A funarg is a list
beginning with the atomic symbol funarg, as you might expect, and containing a
function and a binding context pointer. Applying a funarg causes the contained
function to be applied in the contained binding context instead of the usual
context. funargs are created by the *function special form.
An expr property may be an atomic symbol rather than a lambda-expression. In
this case, the atomic symbol is used as the function. The original symbol is
simply a synonym for it.
In addition to the variety of application just described, which is used
internally by the evaluation procedure, there is a similar but not identical
application procedure available through the function apply. The main difference
is that the function and the arguments are passed to apply separately. They are
not encoded into a form, consequently macros are not accepted by this version of
application. Note that what is passed to apply is a list of arguments, not a
list of expressions which, evaluated, would yield arguments.
Page 1-20 ∪1-3.3 December 5, 1977
**DRAFT** The Basic Actions of LISP **DRAFT**
3.4 Special Forms
This section briefly describes some of the special forms in Maclisp. For
full details on a specific special form, consult the Function Index in the back.
Constants
(quote x) evaluates to the S-expression x.
(function x) evaluates to the functional expression x. There is little
real difference between quote and function. The latter is simply a
mnemonic reminder to anyone who reads the program - including the compiler
- that the specified expression is supposed to be some kind of function.
Conditionals
Conditionals control whether or not certain forms are evaluated, depending
on the results of evaluating other forms. Thus both the value and the side
effects of the conditional form can be controlled.
(cond (predicate form1 form2...) (predicate form1 form2...)...)
is a general conditional form. The lists of a predicate and some forms are
called clauses. The cond is evaluated by considering the clauses one by
one in the order they are written. The predicate of a clause is evaluated,
and if the result is true, that is, anything other than nil, then the forms
in that clause are evaluated and the cond is finished without examining the
remaining clauses. If the result is not true, i.e. if it is nil, then the
next clause is examined in the same way. If all the clauses are exhausted,
that is not an error. The value of a cond is the value of the last form it
evaluates, which could be nil if no predicate is true, or the value of a
predicate if that predicate is true but has no forms in its clause.
(and form1 form2 form3...) evaluates the forms in succession until one is
nil or the forms are exhausted, and the result is the value of the last
form evaluated.
(or form1 form2 form3...) evaluates the forms until one is non-nil or the
forms are exhausted, and the result is the value of the last form
evaluated.
December 5, 1977 ∪1-3.4 Page 1-21
**DRAFT** Maclisp Reference Manual **DRAFT**
Non-Local Exits
(catch form tag) evaluates the form, but if the special form (throw value
tag) is encountered, and the tags are the same, the catch immediately
returns the value without further ado. See page 2-44 for the full details.
Iteration
(prog (variable...) form-or-tag ...) allows Fortranoid "programs" with
goto's, local variables, and return's to be written.
(do ...) is the special form for iteration. See page 2-38 for the details
of prog and do.
Defining Functions
(defun name (arg1 arg2...) form1 form2...) defines an (interpreted)
function. See page 2-60 for full details.
Error Control
(break name t) causes ";bkpt name" to be typed out and gives control to a
read-eval-print loop so that the user can examine and change the state of
the world. When he is satisfied, the user can cause the break to return a
value. See page 3-5 for the details of break.
(errset form) evaluates the form, but if an error occurs the errset simply
returns nil. If no error occurs, the value is a list whose single element
is what the value of the form would have been without errset.
Assignment
(setq var1 value1 var2 value2...) assigns the values to the variables. The
values are forms which are evaluated.
(store (array subscript1 subscript2...) value) assigns the value to the
array cell selected by subscripting. See part 2.8 for further information
on arrays.
Page 1-22 ∪1-3.4 December 5, 1977
**DRAFT** The Basic Actions of LISP **DRAFT**
Miscellaneous Parameters
(status name -optional args-) returns miscellaneous parameters of LISP.
name is a mnemonic name for what is to be done.
(sstatus name -optional args-) sets miscellaneous parameters.
See part 3.7 for the details of status and sstatus.
Pretty-Printing
(grindef x) prettily prints the value and function definition (if any) of
the atomic symbol x. Indentation is used to reveal structure, the quote
special form is represented by ', etc. See part 6.3 for the details.
Tracing
(trace name) causes the function name to print a message whenever it is
called and whenever it returns. See page 3-34 for the many features and
options of trace.
December 5, 1977 ∪1-3.4 Page 1-23
**DRAFT** Maclisp Reference Manual **DRAFT**
3.5 Binding Context Pointers
There is a special type of object called a binding context pointer, or
sometimes an "a-list pointer", which can be used to refer to a binding context
(a set of bindings of variables and values which was extant at a particular
instant.) Due to the stack implementation of Maclisp, a binding context pointer
is only valid while control is nested within the binding context it names. It
is not possible to exit from within a binding context but keep it around by
retaining a pointer to it.
A binding context pointer is either a negative fixnum or nil. nil means the
"global" or "top level" binding context. The negative fixnum is a special value
of implementation dependent meaning which should be obtained only from one of
the four following sources: the function evalframe, the function errframe, the
special form *function, or the second lambda-variable of a fexpr.
The only use for binding context pointers is to pass them to the functions
eval and apply to specify the binding context in which variables are to be
evaluated and assignments are to be performed during that evaluation or
application. Binding context pointers are also used internally by *function.
When it generates a funarg, it puts in the funarg the functional expression it
was given and a binding context pointer designating the binding environment
current at the time *function was called.
Page 1-24 ∪1-3.5 December 5, 1977
**DRAFT** Function Descriptions **DRAFT**
Part 2 - Function Descriptions
Table of Contents
1. Predicates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-1
2. The Evaluator . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-7
3. Manipulating List Structure . . . . . . . . . . . . . . . . . . . .2-15
3.1 Conses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-15
3.2 Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-18
3.3 Alteration of List Structure . . . . . . . . . . . . . . . . . . . .2-23
3.4 Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-25
3.5 Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-31
3.6 Hunks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-33
4. Flow of Control . . . . . . . . . . . . . . . . . . . . . . . . . .2-35
4.1 Conditionals . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-36
4.2 Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-38
4.3 Non-local Exits . . . . . . . . . . . . . . . . . . . . . . . . . .2-44
4.4 Causing and Controlling Errors . . . . . . . . . . . . . . . . . . .2-46
5. Atomic Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . .2-49
5.1 The Value Cell . . . . . . . . . . . . . . . . . . . . . . . . . . .2-49
5.2 The Property List . . . . . . . . . . . . . . . . . . . . . . . . .2-52
5.3 The Print-Name . . . . . . . . . . . . . . . . . . . . . . . . . . .2-56
5.4 Interning of Symbols . . . . . . . . . . . . . . . . . . . . . . . .2-58
5.5 Defining Atomic Symbols as Functions . . . . . . . . . . . . . . . .2-61
6. Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-65
6.1 Number Predicates . . . . . . . . . . . . . . . . . . . . . . . . .2-65
6.2 Comparison . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-67
6.3 Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-69
6.4 Arithmetic . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-71
6.5 Exponentiation and Logarithm Functions . . . . . . . . . . . . . . .2-79
6.6 Trigonometric Functions . . . . . . . . . . . . . . . . . . . . . .2-80
6.7 Random Functions . . . . . . . . . . . . . . . . . . . . . . . . . .2-81
6.8 Logical Operations on Numbers . . . . . . . . . . . . . . . . . . .2-82
7. Character Manipulation . . . . . . . . . . . . . . . . . . . . . . .2-85
7.1 Character Objects . . . . . . . . . . . . . . . . . . . . . . . . .2-85
December 5, 1977 Page 2-1
**DRAFT** Maclisp Reference Manual **DRAFT**
7.2 Character Strings . . . . . . . . . . . . . . . . . . . . . . . . .2-89
8. Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2-91
9. Mapping Functions . . . . . . . . . . . . . . . . . . . . . . . . .2-99
Page 2-2 December 5, 1977
**DRAFT** Predicates **DRAFT**
1. Predicates
A predicate is a function which tests for some condition involving its
argument and returns t if that condition is true, or nil if it is not true.
The following predicates are for checking data types. These predicates
return t if their argument is of the type indicated by the name of the function,
nil if it is of some other type. Note that the name of most predicates ends in
the letter p, by convention.
atom SUBR 1 arg
The atom predicate returns nil if its argument is a dotted-pair or a list,
or t if it is any kind of atomic object such as a number, a character
string, or an atomic symbol.
symbolp SUBR 1 arg
The symbolp predicate returns t if its argument is an atomic symbol, or nil
if it is anything else.
fixp SUBR 1 arg
The fixp predicate returns t if its argument is a fixnum or a bignum,
otherwise nil.
floatp SUBR 1 arg
The floatp predicate returns t if its argument is a flonum, nil if it is
not.
bigp SUBR 1 arg
The predicate bigp returns t if its argument is a bignum, and nil
otherwise.
December 5, 1977 ∪2-1. Page 2-1
**DRAFT** Maclisp Reference Manual **DRAFT**
numberp SUBR 1 arg
The numberp predicate returns t if its argument is any kind of number, nil
if it is not.
hunkp SUBR 1 arg
The hunkp predicate returns t if its argument is a hunk (see page 2-33 for
a discussion of hunks). hunkp does not consider list cells to be hunks.
This predicate does not exist in the Multics implementation.
typep SUBR 1 arg
typep is a general function for constructing type-predicates. It returns
an atomic symbol describing the type of its argument, chosen from the list
(fixnum flonum bignum list symbol string array random)
symbol means atomic symbol. list means a list or a cons. array means
array-pointer. random is for all types that don't fit in any other
category. Thus numberp could have been defined by:
(defun numberp (x)
(and (memq (typep x) '(fixnum flonum bignum))
t))
The following two functions only exist in the Multics implementation.
stringp SUBR 1 arg
The stringp predicate returns t if its argument is a string, otherwise nil.
subrp SUBR 1 arg
The subrp predicate returns t if its argument is a "subr" object, i.e. a
pointer to the machine code for a compiled or system function. Example:
(subrp (get 'car 'subr)) => t
Page 2-2 ∪2-1. December 5, 1977
**DRAFT** Predicates **DRAFT**
The following are a more miscellaneous set of predicates.
eq SUBR 2 args
(eq x y) => t if x and y are exactly the same object, nil otherwise (cf.
equal). It should be noted that things that print the same are not
necessarily eq to each other. In particular, numbers with the same value
need not be eq, and two similar lists are usually not eq. In general, two
atomic symbols with the same print-name are eq, but it is possible with
maknam or multiple obarrays to generate symbols which have the same print-
name but are not eq. Examples:
(eq 'a 'b) => nil
(eq 'a 'a) => t
(eq '(a . b) '(a . b)) => nil (usually)
(eq (cons 'a 'b) (cons 'a 'b)) => nil (always)
(setq x '(a . b)) (eq x x) => t since it is
the same copy of (a . b) in both arguments.
(setq x (setq y 17)) (eq x y) => t or nil
depending on the implementation. You can
never rely on numbers being eq.
equal SUBR 2 args
The equal predicate returns t if its arguments are similar (isomorphic)
objects. (cf. eq) Two numbers are equal if they have the same value (a
flonum is never equal to a fixnum though). Two strings are equal if they
have the same length, and the characters composing them are the same. All
other atomic objects are equal if and only if they are eq. For dotted
pairs and lists, equal is defined recursively as the two car's being equal
and the two cdr's being equal. Thus equal could have been defined by:
December 5, 1977 ∪2-1. Page 2-3
**DRAFT** Maclisp Reference Manual **DRAFT**
(defun equal (x y)
(or (eq x y)
(and (numberp x) (numberp y) (numequal x y))
(and (not (atom x))
(not (atom y))
(equal (car x) (car y))
(equal (cdr x) (cdr y)))))
if there was an auxiliary function for numeric equality:
(defun numequal (x y)
(and (eq (typep x) (typep y))
(zerop (difference x y))))
This numequal function is not the same as the Maclisp numeric-equality
function, =, because the latter only compares non-big numbers.
As a consequence of the above definition, it can be seen that equal need
not terminate when applied to looped list structure. In addition, eq
always implies equal. An intuitive definition of equal (which is not quite
correct) is that two objects are equal if they look the same when printed
out.
not SUBR 1 arg
not returns t if its argument is nil, otherwise nil.
null SUBR 1 arg
This is the same as not. Both functions are provided for the sake of
clarity. null should be used to check if something is nil and return a
logical value. not should be used to invert the sense of a logical value.
Even though Lisp uses nil to represent logical "false," you shouldn't make
understanding your program depend on this. For example, one often writes
(cond ((not (null x)) ... )
( ... ))
Page 2-4 ∪2-1. December 5, 1977
**DRAFT** Predicates **DRAFT**
rather than
(cond (x ... )
( ... ))
There is no loss of efficiency since these will compile into exactly the
same instructions.
See also the number predicates (page 2-63).
December 5, 1977 ∪2-1. Page 2-5
**DRAFT** Maclisp Reference Manual **DRAFT**
Page 2-6 ∪2-1. December 5, 1977
**DRAFT** The Evaluator **DRAFT**
2. The Evaluator
eval LSUBR 1 or 2 args
(eval x) evaluates x, as a form, atomic or otherwise, and returns the
result.
(eval x p) evaluates x in the context specified by the binding context
pointer p. Example:
(setq x 43 foo 'bar)
(eval (list 'cons x 'foo))
=> (43 . bar)
apply LSUBR 2 or 3 args
(apply f y) applies the function f to the list of arguments y. Unless f is
an fsubr or fexpr, such as cond or and, which evaluates its arguments in a
funny way, the arguments in the list y are used without being evaluated.
Examples:
(setq f '+) (apply f '(1 2 3)) => 6
(setq f '-) (apply f '(1 2 3)) => -4
(apply 'cons '((+ 2 3) 4)) =>
((+ 2 3) . 4) not (5 . 4)
(apply f y p) works like apply with two arguments except that the
application is done with the variable bindings specified by the binding
context pointer p.
quote FSUBR
The special form (quote x) returns x without trying to evaluate it. quote
is used to include constants in a form. For convenience, the read function
normally converts any S-expression preceded by the apostrophe or acute
accent character (') into the quote special form. For example,
December 5, 1977 ∪2-2. Page 2-7
**DRAFT** Maclisp Reference Manual **DRAFT**
(setq x '(some list))
is converted by the reader to:
(setq x (quote (some list)))
which when evaluated causes the variable x to be set to the constant list
value shown. For more information on input syntax, see the detailed
discussion in part 5.1.
quote could have been defined by:
(defun quote fexpr (x) (car x))
function FSUBR
function is like quote except that its argument is a functional expression.
To the interpreter, quote and function are identical, but the compiler
needs to be able to distinguish between a random piece of data, which
should be left alone, and a function, which should be compiled into machine
code. Example:
(mapcar (function (lambda (p q)
(cond ((eq p '*) q)
(t (list p '= q)) )))
first-list-of-things
(compute-another-list) )
calls mapcar with three arguments, the first of which is the function
defined by the lambda-expression. The actual value passed to mapcar
depends on whether the form has been compiled. If it is interpreted, the
lambda-expression written above will be passed. If it is compiled, an
automatically-generated atomic symbol with the compiled code for the
lambda-expression as its subr property will be passed. The usual thing to
do with functional arguments is to invoke them via apply or funcall, which
accept both the compiled and the interpreted functional forms.
function makes no attempt to solve the "funarg problem." *function should
be used for this purpose.
Page 2-8 ∪2-2. December 5, 1977
**DRAFT** The Evaluator **DRAFT**
*function FSUBR
The value of (*function f) is a "funarg" of the function f. A funarg can
be used like a function. It has the additional property that it contains a
binding context pointer so that the values of variables are bound the same
during the application of the funarg as at the time it was created,
provided that the binding environment in which the funarg was created still
exists on the stack. Hence if foo is a function that accepts a functional
argument, such as
(defun foo (f)
(append one-value (f the-other-value) ))
or, better
(defun foo (f)
(append one-value (funcall f the-other-value) ))
then
(foo (*function bar))
works, but
(foo (prog (x y z)
(do something)
(return (*function bar)) ))
does not if bar intends to reference the prog variables x, y, and z.
*function is intended to help solve the "funarg problem," however it only
works in some easy cases. Funargs generated by *function are intended for
use as functional arguments and cannot be returned as values of functional
applications. Thus, the user should be careful in his use of *function to
make sure that his use does not exceed the limitations of the Maclisp
funarg mechanism.
It is possible to assign a value to a variable when a previous binding of
that variable has been made current by a funarg. The assignment will be
executed in the proper context. (This has not always been the case in
Maclisp; it is a fairly new feature.)
A funarg has the form
(funarg function . context-ptr)
December 5, 1977 ∪2-2. Page 2-9
**DRAFT** Maclisp Reference Manual **DRAFT**
comment FSUBR
comment ignores its arguments and returns the atomic symbol comment.
Example:
(defun foo (x)
(cond ((null x) 0)
(t (comment x has something in it)
(1+ (foo (cdr x))))))
Usually it is preferable to comment code using the semicolon-macro feature
of the standard input syntax. This allows the user to add comments to his
code which are ignored by the lisp reader.
Example:
(defun foo (x)
(cond ((null x) 0)
(t (1+ (foo (cdr x)))) ;x has something in it
))
A problem with such comments is that they are discarded when the S-
expression is read into lisp. If it is edited within lisp and printed back
into a file, the comments will be lost. However, most users edit the
original file and read the changes into lisp, since this allows them to use
the editor of their choice. Thus this is not a real problem.
prog2 LSUBR 2 or more args
The expressions in a prog2 form are evaluated from left to right, as in any
lsubr-form. The result is the second argument. prog2 is most commonly
used to evaluate an expression with side effects, then return a value which
needs to be computed before the side effects happen.
Examples:
(prog2 (do-this) (do-that)) ;just get 2 things evaluated
(setq x (prog2 nil y ;parallel assignment
(setq y x))) ;which exchanges x and y
(defun prog2 nargs (arg 2)) ;a lexpr definition for prog2
Page 2-10 ∪2-2. December 5, 1977
**DRAFT** The Evaluator **DRAFT**
progn LSUBR 1 or more args
The expressions in a progn form are evaluated from left to right, as usual,
and the result is the value of the last one. In other words, progn is an
lsubr which does nothing but return its last argument. Although lambda-
expressions, prog-forms, do-forms, cond-forms, and iog-forms all use progn
implicitly, that is, they allow multiple forms in their bodies, there are
occasions when one needs to evaluate a number of forms for side-effects and
make them appear to be a single form. progn serves this purpose. Example:
(progn (setq a (cdr frob)) (eq (car a) (cadr a)))
might be used as the antecedent of a cond clause.
progn could have been defined by:
(defun progn nargs
(and (> nargs 0)
(arg nargs)))
progv FSUBR
progv is a special form to provide the user with extra control over lambda-
binding. It binds a list of variables to a list of values, and then
evaluates some forms. The lists of variables and values are computed
quantities; this is what makes progv different from lambda, prog, and do.
(progv var-list value-list form1 form2 ... )
first evaluates var-list and value-list. Then the variables are bound to
the values. In compiled code the variables must be special, since the
compiler has no way of knowing what symbols might appear in the var-list.
If too few values are supplied, the remaining variables are bound to nil.
If too many values are supplied, the excess values are ignored.
After the variables have been bound to the values, the forms are evaluated,
and finally the variable bindings are undone. The result returned is the
value of the last form. Note that the "body" of a progv is similar to that
of progn, not that of prog.
Example:
December 5, 1977 ∪2-2. Page 2-11
**DRAFT** Maclisp Reference Manual **DRAFT**
(setq a 'foo b 'bar)
(progv (list a b 'b) (list b) (list a b foo bar))
=> (foo nil bar nil)
During the evaluation of the body of this progv, foo is bound to bar, bar
is bound to nil, b is bound to nil, and a remains bound to foo.
arg SUBR 1 arg
(arg nil), when evaluated during the application of a lexpr, gives the
number of arguments supplied to that lexpr. This is primarily a debugging
aid, since lexprs also receive their number of arguments as the value of
their lambda-variable.
(arg i), when evaluated during the application of a lexpr, gives the value
of the i'th argument to the lexpr. i must be a fixnum in this case. It is
an error if i is less than 1 or greater than the number of arguments
supplied to the lexpr.
Example:
(defun foo nargs ;define a lexpr foo.
(print (arg 2)) ;print the second argument.
(+ (arg 1) ;return the sum of the first
(arg (- nargs 1)))) ;and next to last arguments.
setarg SUBR 2 args
setarg is used only during the application of a lexpr. (setarg i x) sets
the lexpr's i'th argument to x. i must be greater than zero and not
greater than the number of arguments passed to the lexpr. After (setarg i
x) has been done, (arg i) will return x.
Page 2-12 ∪2-2. December 5, 1977
**DRAFT** The Evaluator **DRAFT**
listify SUBR 1 arg
(listify n) efficiently manufactures a list of n of the arguments of a
lexpr. With a positive argument n, it returns a list of the first n
arguments of the lexpr. With a negative argument n, it returns a list of
the last (abs n) arguments of the lexpr. Basically, it works as if defined
as follows:
(defun listify (n)
(cond ((minusp n)
(listify1 (arg nil) (+ (arg nil) n 1)))
(t
(listify1 n 1)) ))
(defun listify1 (n m) ; auxiliary function.
(do ((i n (1- i))
(result nil (cons (arg i) result)))
((< i m) result) ))
funcall LSUBR 1 or more args
(funcall f a1 a2 ... an) calls the function f with the arguments a1, a2,
..., an. It is similar to apply except that the separate arguments are
given to funcall, rather than a list of arguments. If f is a fexpr or an
fsubr there must be exactly one argument. f may not be a macro. Example:
(setq cons 'plus)
(cons 1 2) => (1 . 2)
(funcall cons 1 2) => 3
subrcall FSUBR
subrcall is used to invoke a subr-pointer directly, rather than by
referring to an atomic symbol of which the subr-pointer is the subr
property. The form is:
(subrcall type p a1 a2 ... an)
All arguments except the first are evaluated. type is the type of result
expected: fixnum, flonum, or nil (any type). p is the subr pointer to be
December 5, 1977 ∪2-2. Page 2-13
**DRAFT** Maclisp Reference Manual **DRAFT**
called. a1 through an are the arguments to be passed to the subr.
subrcall compiles into efficient machine code.
lsubrcall FSUBR
lsubrcall is identical to subrcall except that the subr-pointer called has
to be an lsubr instead of a subr. This is because many Lisps use different
internal calling sequences for lsubrs than for subrs.
arraycall FSUBR
arraycall is similar to subrcall and lsubrcall except that an array-pointer
is used instead of a subr-pointer. The first argument of arraycall must
correspond to the type that the array was given when it was created. An
arraycall expression may be used as the first argument to store.
Page 2-14 ∪2-2. December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
3. Manipulating List Structure
3.1 Conses
car SUBR 1 arg
Returns the first component of a cons.
Example: (car '(a b)) => a
cdr SUBR 1 arg
Returns the second component of a cons.
Example: (cdr '(a b c)) => (b c)
car SWITCH
cdr SWITCH
Officially car and cdr are only applicable to lists. However, as a matter
of convenience the car and cdr of nil are nil. This allows programs to car
and cdr off the ends of lists without having to check, which is sometimes
helpful. Furthermore, some old programs apply car and cdr to objects other
than lists in order to hack with the internal representation. To provide
control over this, the value of car can be set to control which data types
are subject to the car operation. Similarly, the value of cdr controls the
cdr operation. Illegal operations will cause errors. For reasons of
efficiency, this error checking is only enabled in (*rset t) mode (see page
3-28) and is mostly turned off in compiled programs. The values tk which
the switches may be set are:
December 5, 1977 ∪2-3. Page 2-15
**DRAFT** Maclisp Reference Manual **DRAFT**
Value Operation applicable to
list lists.
nil lists and nil.
symbol lists, nil, and symbols.
t anything.
The default value of the switches is nil.
c...r SUBR 1 arg
All the compositions of up to four car's and cdr's are defined as functions
in their own right. The names begin with c and end with r, and in between
is a sequence of a's and d's corresponding to the composition performed by
the function.
For example,
(cddadr x) = (cdr (cdr (car (cdr x))))
Some of the most commonly used ones are: cadr, which gets the second
element of a list; caddr, which gets the third element of a list; cadddr,
which gets the fourth element of a list; caar, to car twice.
The car'ing and cdr'ing operations of these functions have error checking
under the control of the car and cdr switches explained above, just as the
car and cdr functions themselves do.
cons SUBR 2 args
This is a primitive function to construct a new dotted pair whose car is
the first argument to cons, and whose cdr is the second argument to cons.
Thus the following identities hold (except when numbers are involved; as
always numbers are not well-behaved with respect to eq):
(eq (car (cons x y)) x) => t
(eq (cdr (cons x y)) y) => t
Page 2-16 ∪2-3.1 December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
Examples:
(cons 'a 'b) => (a . b)
(cons 'a (cons 'b (cons 'c nil))) => (a b c)
(cons 'a '(b c d e f)) => (a b c d e f)
ncons SUBR 1 arg
(ncons x) = (cons x nil) = (list x)
xcons SUBR 2 args
xcons ("exchange cons") is like cons except that the order of arguments is
reversed.
Example:
(xcons 'a 'b) => (b . a)
December 5, 1977 ∪2-3.1 Page 2-17
**DRAFT** Maclisp Reference Manual **DRAFT**
3.2 Lists
last SUBR 1 arg
last returns the last cons of the list which is its argument.
Example:
(setq x '(a b c d))
(last x) => (d)
(rplacd (last x) '(e f))
x => (a b c d e f)
last could have been defined by:
(defun last (x)
(cond ((null x) x)
((null (cdr x)) x)
((last (cdr x))) ))
In some implementations, the null check above may be replaced by an atom
check, which will catch dotted lists. Code which depends on this fact
should not be written though, because all implementations are subject to
change on this point.
length SUBR 1 arg
length returns the length of its argument, which must be a list. The
length of a list is the number of top-level conses in it.
Examples:
(length nil) => 0
(length '(a b c d)) => 4
(length '(a (b c) d)) => 3
length could have been defined by:
Page 2-18 ∪2-3.2 December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
(defun length (x)
(cond ((null x) 0)
((1+ (length (cdr x)))) ))
or by:
(defun length (x)
(do ((n 0 (1+ n))
(y x (cdr y)))
((null y) n) ))
The warning about dotted lists given under last applies also to length.
list LSUBR 0 or more args
list constructs and returns a list of its arguments.
Example:
(list 3 4 'a (car '(b . c)) (+ 6 -2)) => (3 4 a b 4)
list could have been defined by:
(defun list nargs
(do ((n nargs (1- n))
(s nil (cons (arg n) s)))
((zerop n) s) ))
(This depends on parallel assignment to the control variables of do.)
append LSUBR 0 or more args
The arguments to append are lists. The result is a list which is the
concatenation of the arguments. The arguments are not changed (cf. nconc).
For example,
(append '(a b c) '(d e f) nil '(g)) => (a b c d e f g)
To make a copy of the top level of a list, that is, to copy the list but
not its elements, use (append x nil).
December 5, 1977 ∪2-3.2 Page 2-19
**DRAFT** Maclisp Reference Manual **DRAFT**
A version of append which only accepts two arguments could have been
defined by:
(defun append2 (x y)
(cond ((null x) y)
((cons (car x) (append2 (cdr x) y)) )))
The generalization to any number of arguments could then be made using a
lexpr:
(defun append argcount
(do ((i (1- argcount) (1- i))
(val (arg argcount) (append2 (arg i) val)))
((zerop i) val) ))
reverse SUBR 1 arg
Given a list as argument, reverse creates a new list whose elements are the
elements of its argument taken in reverse order. reverse does not modify
its argument, unlike nreverse which is faster but does modify its argument.
Example:
(reverse '(a b (c d) e)) => (e (c d) b a)
reverse could have been defined by:
(defun reverse (x)
(do ((l x (cdr l)) ; scan down argument,
(r nil ; putting each element
(cons (car l) r))) ; into list, until
((null l) r))) ; no more elements.
nconc LSUBR 0 or more args
nconc takes lists as arguments. It returns a list which is the arguments
concatenated together. The arguments are changed, rather than copied.
(cf. append)
Example:
(nconc '(a b c) '(d e f)) => (a b c d e f)
Page 2-20 ∪2-3.2 December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
Note that the constant (a b c) has now been changed to (a b c d e f). If
this form is evaluated again, it will yield (a b c d e f d e f). This is a
danger you always have to watch out for when using nconc.
nconc could have been defined by:
(defun nconc (x y) ;for simplicity, this definition
(cond ((null x) y) ;only works for 2 arguments.
(t (rplacd (last x) y) ;hook y onto x
x))) ;and return the modified x.
nreverse SUBR 1 arg
nreverse reverses its argument, which should be a list. The argument is
destroyed by rplacd's all through the list (cf. reverse).
Example:
(nreverse '(a b c)) => (c b a)
nreverse could have been defined by:
(defun nreverse (x)
(cond ((null x) nil)
((nreverse1 x nil))))
(defun nreverse1 (x y) ;auxiliary function
(cond ((null (cdr x)) (rplacd x y))
((nreverse1 (cdr x) (rplacd x y)))))
;; this last call depends on order of argument evaluation.
nreconc SUBR 2 args
(nreconc x y) is exactly the same as (nconc (nreverse x) y) except that it
is more efficient.
nreconc could have been defined by:
(defun nreconc (x y)
(cond ((null x) y)
((nreverse1 x y)) ))
December 5, 1977 ∪2-3.2 Page 2-21
**DRAFT** Maclisp Reference Manual **DRAFT**
using the same nreverse1 as above.
Page 2-22 ∪2-3.2 December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
3.3 Alteration of List Structure
The functions rplaca and rplacd are used to make alterations in already-
existing list structure. The structure is not copied but physically altered;
hence caution should be exercised when using these functions as strange side-
effects can occur if portions of list structure become shared unbeknownst to the
programmer. The nconc, nreverse, and nreconc functions already described have
the same property. However, they are normally not used for this side-effect;
rather, the list-structure modification is purely for efficiency and compatible
non-modifying functions are provided.
rplaca SUBR 2 args
(rplaca x y) changes the car of x to y and returns (the modified) x.
Example:
(setq g '(a b c))
(rplaca (cdr g) 'd) => (d c)
Now g => (a d c)
rplacd SUBR 2 args
(rplacd x y) changes the cdr of x to y and returns (the modified) x.
Example:
(setq x '(a b c))
(rplacd x 'd) => (a . d)
Now x => (a . d)
See also setplist (page 2-55).
December 5, 1977 ∪2-3.3 Page 2-23
**DRAFT** Maclisp Reference Manual **DRAFT**
subst SUBR 3 args
(subst x y z) substitutes x for all occurrences of y in z, and returns the
modified copy of z. The original z is unchanged, as subst recursively
copies all of z replacing elements eq to y as it goes. If x and y are nil,
z is just copied, which is a convenient way to copy arbitrary list
structure.
Example:
(subst 'Tempest 'Hurricane
'(Shakespeare wrote (The Hurricane)))
=> (Shakespeare wrote (The Tempest))
subst could have been defined by:
(defun subst (x y z)
(cond ((eq z y) x) ;if item eq to y, replace.
((atom z) z) ;if no substructure, return arg.
((cons (subst x y (car z)) ;otherwise recurse.
(subst x y (cdr z))))))
sublis SUBR 2 args
sublis makes substitutions for atomic symbols in an S-expression. The
first argument to sublis is an association list (see the next section).
The second argument is the S-expression in which substitutions are to be
made. sublis looks at all atomic symbols in the S-expression; if an atomic
symbol appears in the association list occurrences of it are replaced by
the object it is associated with. The argument is not modified; new conses
are created where necessary and only where necessary, so the newly created
structure shares as much of its substructure as possible with the old. For
example, if no substitutions are made, the result is eq to the old S-
expression.
Example:
(sublis '((x . 100) (z . zprime))
'(plus x (minus g z x p) 4))
=> (plus 100 (minus g zprime 100 p) 4)
In some implementations sublis works by putting temporary sublis properties
on the atomic symbols in the dotted pairs, so beware.
Page 2-24 ∪2-3.3 December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
3.4 Tables
Maclisp includes several functions which simplify the maintenance of tabular
data structures of several varieties. The simplest is a plain list of items,
which models (approximately) the concept of a set. There are functions to add
(cons), remove (delete, delq), and search for (member, memq) items in a list.
Association lists are very commonly used. An association list is a list of
dotted pairs. The car of each pair is a "key" and the cdr is "data". The
functions assoc and assq may be used to retrieve the data, given the key.
Structured records can be stored as association lists or as stereotyped S-
expressions where each element of the structure has a certain car-cdr path
associated with it. There are no built-in functions for these but it easy to
define macros to implement them (see part 6.2).
Simple list-structure is very convenient, but may not be efficient enough for
large data bases because it takes a long time to search a long list. Maclisp
includes some hashing functions (sxhash, maknum) which aid in the construction
of more efficient, hairier structures.
member SUBR 2 args
(member x y) returns nil if x is not a member of the list y. Otherwise, it
returns the portion of y beginning with the first occurrence of x. The
comparison is made by equal. y is searched on the top level only.
Example:
(member 'x '(1 2 3 4)) => nil
(member 'x '(a (x y) c x d e x f)) => (x d e x f)
Note that the value returned by member is eq to the portion of the list
beginning with x. Thus rplaca on the result of member may be used, if you
first check to make sure member did not return nil.
Example:
(catch (rplaca (or (member x z)
(throw nil lose))
y)
lose)
December 5, 1977 ∪2-3.4 Page 2-25
**DRAFT** Maclisp Reference Manual **DRAFT**
member could have been defined by:
(defun member (x y)
(cond ((null y) nil)
((equal x (car y)) y)
((member x (cdr y))) ))
memq SUBR 2 args
memq is like member, except eq is used for the comparison, instead of
equal. memq could have been defined by:
(defun memq (x y)
(cond ((null y) nil)
((eq x (car y)) y)
((memq x (cdr y))) ))
delete LSUBR 2 or 3 args
(delete x y) returns the list y with all top-level occurrences of x
removed. equal is used for the comparison. The argument y is actually
modified (rplacd'ed) when instances of x are spliced out. delete should be
used for value, not for effect. That is, use
(setq a (delete 'b a))
rather than
(delete 'b a))
The latter is not equivalent when the first element of the value of a is
b.
(delete x y n) is like (delete x y) except only the first n instances of x
are deleted. n is allowed to be zero. If n is greater than the number of
occurrences of x in the list, all occurrences of x in the list will be
deleted.
Example:
Page 2-26 ∪2-3.4 December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
(delete 'a '(b a c (a b) d a e)) => (b c (a b) d e)
delete could have been defined by:
(defun delete nargs ; lexpr for 2 or 3 args
(delete1 (arg 1) ; pass along arguments...
(arg 2)
(cond ((= nargs 3) (arg 3))
(123456789.)))) ; infinity
(defun delete1 (x y n) ;auxiliary function
(cond ((or (null y) (zerop n)) y)
((equal x (car y)) (delete1 x
(cdr y)
(1- n)))
((rplacd y (delete1 x (cdr y) n)))))
delq LSUBR 2 or 3 args
delq is the same as delete except that eq is used for the comparison
instead of equal.
sxhash SUBR 1 arg
sxhash computes a hash code of an S-expression, and returns it as a fixnum,
which may be positive or negative. A property of sxhash is that (equal x
y) implies (= (sxhash x) (sxhash y)). The number returned by sxhash is
some possibly large number in the range allowed by fixnums. It is
guaranteed that:
1) sxhash for an atomic symbol will always be positive.
2) sxhash of any particular expression will be constant in a particular
implementation for all time, probably.
3) Two different implementations may hash the same expression into
different values.
4) sxhash of any object of type random will be zero.
December 5, 1977 ∪2-3.4 Page 2-27
**DRAFT** Maclisp Reference Manual **DRAFT**
5) sxhash of a fixnum will = that fixnum.
Here is an example of how to use sxhash in maintaining
hash tables of S-expressions:
(defun knownp (x) ;look up x in the table
(prog (i bkt)
(setq i (plus 76 (remainder (sxhash x) 77)))
;The remainder should be reasonably randomized between
;-76 and 76, thus table size must be > 175 octal.
(setq bkt (table i))
;bkt is thus a list of all those expressions that hash
;into the same number as does x.
(return (member x bkt))))
To write an "intern" for S-expressions, one could
(defun sintern (x)
(prog (bkt i tem)
(setq bkt (table (setq i (+ 2n-2 (\ (sxhash x) 2n-1)))))
;2n-1 and 2n-1 stand for a power of 2 minus one and
;minus two respectively. This is a good choice to
;randomize the result of the remainder operation.
(return (cond ((setq tem (member x bkt))
(car tem))
(t (store (table i) (cons x bkt))
x)))))
assoc SUBR 2 args
(assoc x y) looks up x in the association list (list of dotted pairs) y.
The value is the first dotted pair whose car is equal to x, or nil if there
is none such.
Examples:
(assoc 'r '((a . b) (c . d) (r . x) (s . y) (r . z)))
=> (r . x)
(assoc 'fooo '((foo . bar) (zoo . goo))) => nil
It is okay to rplacd the result of assoc as long as it is not nil, if your
intention is to "update" the "table" that was assoc's second argument.
Page 2-28 ∪2-3.4 December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
Example:
(setq values '((x . 100) (y . 200) (z . 50)))
(assoc 'y values) => (y . 200)
(rplacd (assoc 'y values) 201)
(assoc 'y values) => (y . 201) now
(One should always be careful about using rplacd however)
A typical trick is to say (cdr (assoc x y)). Since the cdr of nil is
guaranteed to be nil, this yields nil if no pair is found (or if a pair is
found whose cdr is nil.)
assoc could have been defined by:
(defun assoc (x y)
(cond ((null y) nil)
((equal x (caar y)) (car y))
((assoc x (cdr y))) ))
assq SUBR 2 args
assq is like assoc except that the comparison uses eq instead of equal.
assq could have been defined by:
(defun assq (x y)
(cond ((null y) nil)
((eq x (caar y)) (car y))
((assq x (cdr y))) ))
sassoc SUBR 3 args
(sassoc x y z) is like (assoc x y) except that if x is not found in y,
instead of returning nil sassoc calls the function z with no arguments.
sassoc could have been defined by:
(defun sassoc (x y z)
(or (assoc x y)
(apply z nil)))
sassoc and sassq (see below) are of limited use. These are primarily
leftovers from Lisp 1.5.
December 5, 1977 ∪2-3.4 Page 2-29
**DRAFT** Maclisp Reference Manual **DRAFT**
sassq SUBR 3 args
(sassq x y z) is like (assq x y) except that if x is not found in y,
instead of returning nil sassq calls the function z with no arguments.
sassq could have been defined by:
(defun sassq (x y z)
(or (assq x y)
(apply z nil)))
maknum SUBR 1 arg
(maknum x) returns a positive fixnum which is unique to the object x; that
is, (maknum x) and (maknum y) are numerically equal if and only if (eq x
y). This can be used in hashing.
In the pdp-10 implementations, maknum returns the memory address of its
argument. In the Multics implementation, an internal hash table is
employed.
Note that unlike sxhash, maknum will not return the same value on an
expression which has been printed out and read back in again.
munkam SUBR 1 arg
munkam is the opposite of maknum. Given a number, it returns the object
which was given to maknum to get that number. It is inadvisable to apply
munkam to a number which did not come from maknum.
Page 2-30 ∪2-3.4 December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
3.5 Sorting
Several functions are provided for sorting arrays and lists. These functions
use algorithms which always terminate no matter what sorting predicate is used,
provided only that the predicate always terminates. The array sort is not
necessarily stable, that is equal items may not stay in their original order.
However the list sort is stable.
After sorting, the argument (be it list or array) is rearranged internally so
as to be completely ordered. In the case of an array argument, this is
accomplished by permuting the elements of the array, while in the list case, the
list is reordered by rplacd's in the same manner as nreverse. Thus if the
argument should not be clobbered, the user must sort a copy of the argument,
obtainable by fillarray or append, as appropriate.
Should the comparison predicate cause an error, such as a wrong type argument
error, the state of the list or array being sorted is undefined. However, if
the error is corrected the sort will, of course, proceed correctly.
Both sort and sortcar handle the case in which their second argument is the
function alphalessp in a more efficient manner than usual. This efficiency is
primarily due to elimination of argument checks at comparison time.
sort SUBR 2 args
The first argument to sort is an array (or list), the second a predicate of
two arguments. Note that a "number array" cannot be sorted. The predicate
must be applicable to all the objects in the array or list. The predicate
should take two arguments, and return non-nil if and only if the first
argument is strictly less than the second (in some appropriate sense).
The sort function proceeds to sort the contents of the array or list under
the ordering imposed by the predicate, and returns the array or list
modified into sorted order, i.e. its modified first argument. Note that
since sorting requires many comparisons, and thus many calls to the
predicate, sorting will be much faster if the predicate is a compiled
function rather than interpreted.
December 5, 1977 ∪2-3.5 Page 2-31
**DRAFT** Maclisp Reference Manual **DRAFT**
Example:
(defun mostcar (x)
(cond ((atom x) x)
((mostcar (car x)))))
(sort 'fooarray
(function (lambda (x y)
(alphalessp (mostcar x) (mostcar y)))))
If fooarray contained these items before the sort:
(Tokens (The lion sleeps tonight))
(Carpenters (Close to you))
((Rolling Stones) (Brown sugar))
((Beach Boys) (I get around))
(Beatles (I want to hold your hand))
then after the sort fooarray would contain:
((Beach Boys) (I get around))
(Beatles (I want to hold your hand))
(Carpenters (Close to you))
((Rolling Stones) (Brown sugar))
(Tokens (The lion sleeps tonight))
sortcar SUBR 2 args
sortcar is exactly like sort, but the items in the array or list being
sorted should all be non-atomic. sortcar takes the car of each item before
handing two items to the predicate. Thus sortcar is to sort as mapcar is
to maplist.
Page 2-32 ∪2-3.5 December 5, 1977
**DRAFT** Manipulating List Structure **DRAFT**
3.6 Hunks
This section applies only to the pdp10 implementation.
Hunks are a generalization of conses, useful in constructing more efficient
data structures. A hunk is like a cons but it has more components; hunks come
in several convenient sizes. The advantage of an n-element hunk over an n-
element list is that the hunk occupies less space (half as much if n is a power
of 2). The elements of a hunk can be referenced more efficiently than the
elements of a list, since the compiler knows the relative locations of the
components and addresses them directly.
The advantage of lists over hunks is flexibility; lists can be any length,
can vary in length, can be altered by rplacd, and can be manipulated with a
library of useful searching, sorting, and combining operations, previously
described in this chapter.
Another feature of hunks is that at times one may treat a hunk as a cons,
ignore the extra components. This allows the construction of list structure
which has extra "frobs" stuck on at certain points. The atom function does not
consider hunks to be atomic; it returns nil if given a hunk.
print represents hunks using an extended form of dot-notation; read however
does not yet understand this notation. See the writeup on print.
hunk LSUBR 0 or more args
hunk takes any number of arguments, and returns a hunk whose components are
the arguments. The first argument is the car, and the last is the cdr;
that is, the arguments are in the order 1, 2, 3, ..., N-1, 0. This is the
same order as print and makhunk use.
The maximum size of a hunk is 128 components. This may vary from
implementation to implementation.
With no arguments, hunk returns nil. With one or two arguments, hunk
returns a cons.
December 5, 1977 ∪2-3.6 Page 2-33
**DRAFT** Maclisp Reference Manual **DRAFT**
cxr SUBR 2 args
(cxr n h) returns the n'th component of the hunk h. car of a hunk returns
the 1st component, and cdr of a hunk returns the 0th component.
rplacx SUBR 3 args
(rplacx n h z) replaces the n'th component of the hunk h with z. The value
of rplacx is its (modified) second argument. rplaca of a hunk replaces its
1st component, and rplacd of a hunk replaces its 0th component.
makhunk SUBR 1 arg
(makhunk n), where n is a fixnum, creates and returns an n-element hunk,
filled with nils. (makhunk l), where l is a list, creates and returns a
hunk of the appropriate length, initialized from l. This is like (apply
'hunk l).
Like hunk, makhunk will return nil or a cons if you ask for a hunk of 0, 1,
or 2 elements.
hunksize SUBR 1 arg
hunksize returns the number of components in its argument. hunksize of nil
is 0 and hunksize of a cons is 2.
hunkp VARIABLE
If the value of hunkp is nil, the functions print, equal, and purcopy treat
hunks as conses, as most other system functions do. The extra elements are
simply ignored. If the value of hunkp is non-nil, which is the default,
these three functions deal with all the elements. sxhash always deals with
all the elements.
Page 2-34 ∪2-3.6 December 5, 1977
**DRAFT** Flow of Control **DRAFT**
4. Flow of Control
Maclisp provides a variety of structures for flow of control.
Functional application is the basic method for construction of programs. All
operations are written as the application of a function to arguments. Maclisp
programs are often written as a large collection of small functions which
implement simple operations. Some of the functions work by calling others of
the functions, thus defining some operations in terms of others.
Recursion exists when a function calls itself. This is analogous to
mathematical induction.
Iteration is a control structure present in most languages. It is similar to
recursion but sometimes less useful and sometimes more useful. Maclisp contains
a generalized iteration facility. The iteration facility also permits those who
like "gotos" to use them.
Conditionals allow control to branch depending on the value of a predicate.
and and or are basically one-arm conditionals, while cond is a generalized
multi-armed conditional.
Nonlocal exits are similar to a return, except that the return is from
several levels of function calling rather than just one, and is determined at
run time. These are mostly used for applications such as escaping from the
middle of a function when it is discovered that the algorithm is not applicable.
Errors are a type of non-local exit used by the Lisp interpreter when it
discovers a condition that it does not like. Errors have the additional feature
of correctability, which allows a user-specified function (most often a break
loop), to get a chance to come in and correct the error or at least inspect what
was happening and determine what caused it, before the nonlocal exit occurs.
This is explained in detail on part 3.4.
Maclisp does not directly provide "hairy control structure" such as multiple
processes, backtracking, or continuations.
December 5, 1977 ∪2-4. Page 2-35
**DRAFT** Maclisp Reference Manual **DRAFT**
4.1 Conditionals
and FSUBR
(and form1 form2...) evaluates the forms one at a time, from left to right.
If any form evaluates to nil, and immediately returns nil without
evaluating the remaining forms. If all the forms evaluate non-nil, and
returns the value of the last one. and can be used both for logical
operations, where nil stands for False and t stands for True, and as a
conditional expression.
Examples:
(and x y)
(and (setq temp (assq x y))
(rplacd temp z))
(and (null (errset (something)))
(princ "There was an error."))
Note: (and) => t, which is the identity for this operation.
or FSUBR
(or form1 form2...) evaluates the forms one by one from left to right. If
a form evaluates to nil, or proceeds to evaluate the next form. If there
are no more forms, or returns nil. But if a form evaluates non-nil, or
immediately returns that value without evaluating any remaining forms. or
can be used both for logical operations, where nil stands for False and t
for True, and as a conditional expression.
Note: (or) => nil, the identity for this operation.
cond FSUBR
The cond special form consists of the word cond followed by several
clauses. Each clause consists of a predicate followed by zero or more
forms. Sometimes the predicate is called the antecedent and the forms are
called the consequents.
Page 2-36 ∪2-4.1 December 5, 1977
**DRAFT** Flow of Control **DRAFT**
(cond (antecedent consequent consequent...)
(antecedent ...)
... )
The idea is that each clause represents a case which is selected if its
predicate is satisfied and the predicates of all preceding clauses are not
satisfied. When a case is selected, its consequent forms are evaluated.
cond processes its clauses in order from left to right. First the
predicate of the current clause is evaluated. If the result is nil, cond
advances to the next clause. Otherwise, the cdr of the clause is treated
as a list of forms, or consequents, which are evaluated in order from left
to right. After evaluating the consequents, cond returns without
inspecting any remaining clauses. The value of the cond special form is
the value of the last consequent evaluated, or the value of the antecedent
if there were no consequents in the clause. If cond runs out of clauses,
that is, if every antecedent is nil, that is, if no case is selected, the
value of the cond is nil.
Example:
(cond ((zerop x) ;First clause:
(+ y 3)) ; (zerop x) is antecedent.
; (+ y 3) is consequent.
((null y) ;A clause with 2 consequents:
(setq x 4) ; this
(cons x z)) ; and this.
(z) ;A clause with no consequents:
; the antecedent is just z.
) ;This is the end of the cond.
This is like the traditional Lisp 1.5 cond except that it is not necessary
to have exactly one consequent in each clause, and it is permissible to run
out of clauses.
December 5, 1977 ∪2-4.1 Page 2-37
**DRAFT** Maclisp Reference Manual **DRAFT**
4.2 Iteration
prog FSUBR
prog is the "program" special form. It provides temporary variables,
sequential evaluation of statements, and the ability to do "gotos." A prog
looks something like:
(prog (var1 var2...)
tag1
statement1
statement2
tag2
statement3
. . .
)
var1, var2, ... are temporary variables. When the prog is entered the
values of these variables are saved. When the prog is exited they are
restored. The variables are initialized to nil when the prog is entered,
thus they are said to be "bound to nil" by the prog. However, variables
which have been declared fixnum or flonum will be initialized to 0 or 0.0
instead, but only in compiled programs. You should be careful about
relying on the initial value of prog-variables.
The part of a prog after the temporary variable list is the body. An item
in the body may be an atomic symbol or a number, which is a tag, or a non-
atomic form, which is a statement.
prog, after binding the temporary variables, processes its body
sequentially. tags are skipped over; statements are evaluated but the
values are ignored. If the end of the body is reached, prog returns nil.
If (return x) is evaluated, prog stops processing its body and returns the
value x. If (go tag) is evaluated, prog jumps to the part of the body
labelled with the tag. The argument to go is not evaluated unless it is
non-atomic.
It should be noted that the Maclisp prog is an extension of the Lisp 1.5
prog, in that go's and return's may occur in more places than Lisp 1.5
allowed. However, the Lisp compilers implemented on ITS, Multics, and the
DECsystem 10 for Maclisp require that go's and return's be lexically within
Page 2-38 ∪2-4.2 December 5, 1977
**DRAFT** Flow of Control **DRAFT**
the scope of the prog. This makes a function which does not contain a prog,
but which does contain a go or return uncompilable.
See also the do special form, which uses a body similar to prog. The do,
catch, and throw special forms are included in Maclisp as an attempt to
encourage goto-less programming style, which leads to more readable, more
easily maintained code. The programmer is recommended to use these
functions instead of prog wherever reasonable.
Example:
(prog (x y z) ;x, y, z are prog variables - temporaries.
(setq y (car w) z (cdr w)) ;w is a free variable.
loop
(cond ((null y) (return x))
((null z) (go err)))
rejoin
(setq x (cons (cons (car y) (car z))
x))
(setq y (cdr y)
z (cdr z))
(go loop)
err
(break are-you-sure? t)
(setq z y)
(go rejoin))
do FSUBR
The do special form provides a generalized "do loop" facility, with an
arbitrary number of "index variables" whose values are saved when the do is
entered and restored when it is left, i.e. they are bound by the do. The
index variables are used in the iteration performed by do. At the
beginning they are initialized to specified values, and then at the end of
each trip around the loop the values of the index variables are changed
according to specified rules. do allows the programmer to specify a
predicate which determines when the iteration will terminate. The value to
be returned as the result of the form may optionally be specified.
do comes in two varieties.
December 5, 1977 ∪2-4.2 Page 2-39
**DRAFT** Maclisp Reference Manual **DRAFT**
The newer variety of do looks like:
(do ((var init repeat)...)
(end-test exit-form...)
body...)
The first item in the form is a list of zero or more index variable
specifiers. Each index variable specifier is a list of the name of a
variable var, an initial value init, which defaults to nil (or possibly
zero, as mentioned under prog) if it is omitted, and a repeat value repeat.
If repeat is omitted, the var is not changed between loops.
All assignment to the index variables is done in parallel. At the
beginning of the first iteration, all the inits are evaluated, then the
vars are saved, then the vars are setq'ed to the values of the inits. To
put it another way, the vars are lambda-bound to the values of the inits.
Note that the inits are evaluated before the vars are bound. At the
beginning of each succeeding iteration those vars that have repeats get
setq'ed to the values of their respective repeats. Note that all the
repeats are evaluated before any of the vars is changed.
The second element of the do-form is a list of an end testing predicate
end-test and zero or more forms, the exit-forms. At the beginning of each
iteration, after processing of the repeats, the end-test is evaluated. If
the result is nil, execution proceeds with the body of the do. If the
result is not nil, the exit-forms are evaluated from left to right and then
do returns. The value of the do is the value of the last exit-form, or nil
if there were no exit-forms. Note that the second element of the do-form
resembles a cond clause.
If the second element of the form is nil, there is no end-test nor exit-
forms, and the body of the do is executed only once. In this type of do it
is an error to have repeats. This type of do is a "prog with initial
values."
If the second element of the form is the S-expression (nil), there is no
end-test or exit-forms, and the body of the do is executed over and over.
This is a "do forever." The infinite loop can be terminated by use of
return or throw.
The remainder of the do-form constitutes a prog-body. When the end of the
body is reached, the next iteration of the do begins. If return is used,
do returns the indicated value and no more iterations occur.
Page 2-40 ∪2-4.2 December 5, 1977
**DRAFT** Flow of Control **DRAFT**
The older variety of do is:
(do var init repeat end-test body...)
The first time through the loop var gets the value of init; the remaining
times through the loop it gets the value of repeat, which is re-evaluated
each time. Note that init is evaluated before the value of var is saved.
After var is set, end-test is evaluated. If it is non-nil, the do finishes
and returns nil. If the end-test is nil, the body of the loop is executed.
The body is like a prog body. go may be used. If return is used, its
argument is the value of the do. If the end of the prog body is reached,
another loop begins.
Examples of the older variety of do:
(setq n (cadr (arraydims x)))
(do i 0 (1+ i) (= i n)
(store (x i) 0)) ;zeroes out the array x
(do zz x (cdr zz) (or (null zz) (zerop (f (car zz)))))
; this applies f to each element of x
; continuously until f returns zero.
Examples of the new form of do:
(do ((n (cadr (arraydims x)))
(i 0 (1+ i)))
((= i n)
(store (x i) 0))
;this is like the example above,
;except n is local to the do
(do ((x) (y) (z)) (nil) body)
is like
(prog (x y z) body)
except that when it runs off the end of the body, do loops but prog
returns nil. On the other hand,
(do ((x) (y) (z)) nil body)
is identical tk the prog above (it does not loop.)
December 5, 1977 ∪2-4.2 Page 2-41
**DRAFT** Maclisp Reference Manual **DRAFT**
(do ((x y (f x))) ((p x)) body)
is like
(do x y (f x) (p x) body)
The construction
(do ((x e (cdr x)) (oldx x x)) ((null x)) body)
exploits parallel assignment to index variables. On the first iteration,
the value of oldx is whatever value x had before the do was entered. On
succeeding iterations, oldx contains the value that x had on the previous
iteration.
In either form of do, the body may contain no forms at all. Very often an
iterative algorithm can be most clearly expressed entirely in the repeats
and exit-forms of a new-style do, and the body is empty.
(do ((x x (cdr x))
(y y (cdr y))
(z nil (cons (f x y) z))) ;exploits parallel
((or (null x) (null y)) ; assignment.
(nreverse z)) ;typical use of nreverse.
) ;no do-body required.
is like (maplist 'f x y).
go FSUBR
The (go tag) special form is used to do a "go-to" within the body of a do
or a prog. If the tag is an atom, it is not evaluated. Otherwise it is
evaluated and should yield an atom. Then go transfers control to the point
in the body labelled by a tag eq or = to the one given. (Tags may be
either atomic symbols or numbers). If there is no such tag in the body, it
is an unseen-go-tag error.
"Computed" go's should be avoided in compiled code, or altogether.
Page 2-42 ∪2-4.2 December 5, 1977
**DRAFT** Flow of Control **DRAFT**
Example:
(prog (x y z)
(setq x some frob)
loop
do something
(and some predicate (go loop)) ;regular go
do something more
(go (cond ((minusp x) 'loop) ;"computed go"
(t 'endtag)))
endtag
(return z))
return SUBR 1 arg
return is used to return from a prog or a do. The value of return's
argument is returned by prog or do as its value. In addition, break
recognizes the typed-in S-expression (return value) specially. If this
form is typed at a break, value will be evaluated and returned as the value
of break. If not at the top level of a form typed at a break, and not
inside a prog or do, return will cause a fail-act error.
Example:
(do ((x x (cdr x))
(n 0 (* n 2)))
((null x) n)
(cond ((atom (car x))
(setq n (1+ n)))
((memq (caar x) '(sys boom bleah))
(return n))))
December 5, 1977 ∪2-4.2 Page 2-43
**DRAFT** Maclisp Reference Manual **DRAFT**
4.3 Non-local Exits
catch FSUBR
catch is the Maclisp function for doing structured non-local exits. (catch
x) evaluates x and returns its value, except that if during the evaluation
of x (throw y) should be evaluated, catch immediately returns y without
further evaluating x.
catch may also be used with a second argument, not evaluated, which is used
as a tag to distinguish between nested catches. (catch x b) will catch a
(throw y b) but not a (throw y z). throw with only one argument always
throws to the innermost catch. catch with only one argument catches any
throw. It is an error if throw is done when there is no suitable catch.
Example:
(catch (mapcar (function (lambda (x)
(cond ((minusp x)
(throw x negative))
(t (f x)) )))
y)
negative)
which returns a list of f of each element of y if y is all positive,
otherwise the first negative member of y.
The user of catch and throw is advised to stick to the 2 argument versions,
which are no less efficient, and tend to reduce the likelihood of bugs.
The one argument versions exist primarily as an easy way to fix old Lisp
programs which use errset and err for non-local exits. This latter
practice is rather confusing, because err and errset are supposed to be
used for error handling, not general program control.
The catch-tag break is used by the break function.
Page 2-44 ∪2-4.3 December 5, 1977
**DRAFT** Flow of Control **DRAFT**
throw FSUBR
throw is used with catch as a structured non-local exit mechanism.
(throw x) evaluates x and throws the value back to the most recent catch.
(throw x tag) throws the value of x back to the most recent catch labelled
with tag or unlabelled. catch'es with tags not eq to tag are skipped over.
x is evaluated but tag is not.
See the description of catch for further details.
December 5, 1977 ∪2-4.3 Page 2-45
**DRAFT** Maclisp Reference Manual **DRAFT**
4.4 Causing and Controlling Errors
See the complete description of the Maclisp error system (part 3.4) for more
information about how these functions work.
error LSUBR 0 to 3 args
This is a function which allows user functions to signal their own errors
using the Maclisp error system.
(error) is the same as (err).
(error message) signals a simple error; no datum is printed and no user
interrupt is signalled. The error message typed out is message.
(error message datum) signals an error with message as the message to be
typed out and datum as the Lisp object to be printed in the error message.
No user interrupt is signalled.
(error message datum uint-chn) signals an error but first signals a user
interrupt on channel uint-chn, provided that there is such a channel, and
it has a non-nil service function, and the special conditions concerning
errset (see page 3-16) are satisfied. uint-chn is the name of the user-
interrupt channel to be used (an atomic symbol); see part 3.4.2. If the
service function returns an atom, error goes ahead and signals a regular
error. If the service function returns a list, error returns as its value
the car of that list. In this case it was a "correctable" error. This is
the only case in which error will return; in all other cases control is
thrown back to top level, or to the nearest enclosing errset.
errset FSUBR
The special form (errset form flag) is used to trap an expected error.
errset evaluates the form. If an error occurs during the evaluation of the
form, the error is prevented from escaping from inside the errset and
errset returns nil. If no errors occur, a list of one element, the result
of the evaluation, is returned. The result is listified so that there will
no ambiguity if it is nil. errset may also be made to return any arbitrary
value by use of the err function.
Page 2-46 ∪2-4.4 December 5, 1977
**DRAFT** Flow of Control **DRAFT**
The flag is optional. If present, it is evaluated before the form. If it
is nil, no error message will be printed if an error occurs during the
evaluation of the form. If it is not nil, or if it is omitted, any error
messages generated will be printed.
Examples:
If you are not sure x is a number:
(errset (setq x (add1 x)))
This example may not work in compiled code if the compiler chooses to open-
code the add1 rather than calling the add1 subroutine. In general, one
must be extremely foolhardy to depend on error checking in compiled code.
To suppress the error message if the value of a is not an atomic symbol:
(errset (set a b) nil)
To do the same but generate one's own message:
(or (errset (set a b) nil)
(error '(not a variable) a))
err FSUBR
(err) causes an error which is handled the same as a Lisp error except that
there is no preliminary user interrupt, and no message is typed out.
(err x) is like (err) except that if control returns to an errset, the
value of the errset will be the result of evaluating x, instead of nil.
(err x nil) is the same as (err x).
(err x t) is like (err x) except that x is not evaluated until just before
the errset returns it. That is, x is evaluated after unwinding the pdl and
restoring the bindings.
Note: some people use err and errset where catch and throw are indicated.
This is a very poor programming practice. See writeups of catch and throw
for details.
December 5, 1977 ∪2-4.4 Page 2-47
**DRAFT** Maclisp Reference Manual **DRAFT**
Page 2-48 ∪2-4.4 December 5, 1977
**DRAFT** Atomic Symbols **DRAFT**
5. Atomic Symbols
5.1 The Value Cell
Each atomic symbol has associated with it a value cell, which is a piece of
storage that can refer to one Lisp object. This object is called the symbol's
value, since it is what is returned if the symbol is evaluated. The binding of
atomic symbols to values allows them to be used in programming the way
"varaables" are used in other languages.
The value cell can also be empty, in which case the symbol has no value and
is said to be unbound or undefined. This is the initial state of a newly-
created atomic symbol. Attempting to evaluate an unbound symbol causes an error
to be signalled.
An object can be placed into a symbol's value cell by lambda-binding or by
assignment. (See page 1-11.) The difference is in how closely the value-
changing is associated with control structure and in whether it is considered a
side-effect.
setq FSUBR
The setq special form is used to assign values to variables (atomic
symbols.) setq processes the elements of its form in pairs, sequentially
from left to right. The first member of each pair is a variable, the
second is a form which evaluates to a value. The form is evaluated, but
the variable is not. The value-binding of the variable is made to be the
value specified. You must not setq the special atomic-symbol constants t
and nil. The value returned by setq is the last value assigned, i.e. the
result of the evaluation of the last element of the setq-form.
Example: (setq x (+ 1 2 3) y (cons x nil))
This returns (6) and gives x a value of 6 and y a value of (6).
Note that the first assignment is completed before the second assignment is
started, resulting in the second use of x getting the value assigned in the
first pair of the setq.
December 5, 1977 ∪2-5. Page 2-49
**DRAFT** Maclisp Reference Manual **DRAFT**
set SUBR 2 args
set is like setq except that the first argument is evaluated; also set only
takes one pair of arguments. The first argument must evaluate to an atomic
symbol, whose value is changed to the value of the second argument. set
returns the value of its second argument. Example:
(set (cond ((predicate) 'atom1) (t 'atom2))
'stba)
evaluates to stba and gives either atom1 or atom2 a value of stba.
set could have been defined by:
(defun set (x y)
(eval (list 'setq x (list 'quote y))))
Alternatively, setq could have been defined by:
(defun setq fexpr (x)
((lambda (var val rest)
(set var val)
(cond ((null rest) val)
((apply (function setq) rest)) )) ;if more, recurse
(car x)
(eval (cadr x))
(cddr x)))
symeval SUBR 1 arg
(symeval a) returns the value of a, which must be an atomic symbol. The
compiler produces highly optimal code for symeval, making it much better
than eval when the value of a symbol needs to be taken and the particular
symbol to be used varies.
Page 2-50 ∪2-5.1 December 5, 1977
**DRAFT** Atomic Symbols **DRAFT**
boundp SUBR 1 arg
The argument to boundp must be an atomic symbol. If it has a value, t is
returned. Otherwise nil is returned.
makunbound SUBR 1 arg
The argument to makunbound must be an atomic symbol. Its value is removed,
i.e. it becomes unbound.
Example:
(setq a 1)
a => 1
(makunbound 'a)
a => unbnd-vrbl error.
makunbound returns its argument.
December 5, 1977 ∪2-5.1 Page 2-51
**DRAFT** Maclisp Reference Manual **DRAFT**
5.2 The Property List
A property-list is a list with an even number of elements. Each pair of
elements constitutes a property; the first element is called the "indicator" and
the second is called the "value" or, loosely, the "property." The indicator is
generally an atomic symbol which serves as the name of the property. The value
is any Lisp object.
For example, one type of functional property uses the atom expr as its
indicator. In the case of an expr-property, the value is a list beginning with
lambda.
An example of a property list with two properties on it is:
(expr (lambda (x) (plus 14 x)) foobar t)
The first property has indicator expr and value (lambda (x) (plus 14 x)), the
second property has indicator foobar and value t.
Each atomic symbol has associated with it a property-list, which can be
retrieved with the plist function. It is also possible to have "disembodied"
property lists which are not associated with any symbol. These keep the
property list on their cdr, so the form of a disembodied property list is
(<anything> . plist). The way to create a disembodied property list is (ncons
nil). Atomic symbols also (usually) keep their property list on their cdr, but
you aren't allowed to know that. Use the plist function to get the property
list of a symbol.
Property lists are useful for associating "attributes" with symbols. Maclisp
uses properties to remember function definitions. The compiler uses properties
internally to keep track of some of what it knows about the program it is
compiling.
The user familiar with Lisp 1.5 will want to note that the property list
"flags" which are allowed on Lisp 1.5 property lists do not exist in Maclisp.
However, the same effect can be achieved by using properties with a value of t
or nil.
Some property names are used internally by Maclisp, and should therefore be
avoided in user code. These include args, array, autoload, expr, fexpr, fsubr,
lsubr, macro, pname, sublis, subr, value, used by the Lisp system proper; arith,
Page 2-52 ∪2-5.2 December 5, 1977
**DRAFT** Atomic Symbols **DRAFT**
*array, atomindex, *expr, *fexpr, *lexpr, numfun, number, numvar, ohome,
special, sym, used by the compiler; grindfn, grindmacro, used by the grinder.
get SUBR 2 args
(get x y) gets x's y-property. x can be an atomic symbol or a disembodied
property list. The value of x's y-property is returned, unless x has no y-
property in which case nil is returned. It is not an error for x to be a
number, but nil will always be returned since numbers do not have property
lists.
Example:
(get 'foo 'bar)
=> nil ;initially foo has no bar property
(putprop 'foo 'zoo 'bar) ;give foo a bar property
=> zoo
(get 'foo 'bar) ;retrieve that property
=> zoo
(plist 'foo) ;look at foo's property list
=> (bar zoo ...other properties...)
get could have been defined by:
(defun get (x y)
(do ((z (cond ((numberp x) nil)
((atom x) (plist x))
(t (cdr x)))
(cddr z)))
((or (null z) (eq y (car z)))
(cadr z))))
This relies on the fact that the car and the cdr of nil are nil, and
therefore (cadr z) is nil if z is nil.
getl SUBR 2 args
(getl x y) is like get except that y is a list of indicators rather than
just a single indicator. getl searches x's property list until a property
whose indicator appears in the list y is found.
December 5, 1977 ∪2-5.2 Page 2-53
**DRAFT** Maclisp Reference Manual **DRAFT**
The portion of x's property list beginning with the first such property is
returned. The car of this is the indicator (property name) and the cadr is
the property value. getl returns nil if none of the indicators in y appear
on the property list of x. getl could have been defined by:
(defun getl (x pl)
(do ((q (plist x) (cddr q))) ; scan down P-list of x
((or (null q) (memq (car q) pl))
q)))
This definition is simplified and doesn't take numbers and disembodied
property lists into account.
putprop SUBR 3 args
(putprop x y z) gives x a z-property of y and returns y. x may be an
atomic symbol or a disembodied property list. After somebody does (putprop
x y z), (get x z) will return y.
Example:
(putprop 'Nixon 'not 'crook)
If the symbol already has a property with the same name that property is
removed first. This ensures that getl will always find the property which
was put on most recently. Fop instance, if you were to redefine an expr as
a subr, and theN redefine it as an expr again, this effect of putprop
causeq the evaluator to find the l@¬iKgh↓IKMS9SiS←8ACYO¬sfL~(~∀@@@AαA1Sg`A⊃KMS]%iS←\↓←LAi!JAECMSFAaUiae←@AoSi!←khAβ##∃β≤¬voεM≤6∂&≥⎇g~ε|dεw.\,Wπ_Q$ααα∧λ⊗v"M↔∞∞\-v&N\@ππ⊗}λW.≡(⊂⊗~yz9P≠tst:λ12]εBεA⊂⊂λ⊂⊂⊂⊂λ∀22c≥w⊂8:]897xλ∀8⊂<H=∀FEλ⊂⊂⊂⊂λ⊂⊂⊂⊂
92vx≤7x⊂,λ=∀FEλ⊂⊂⊂⊂λ⊂⊂⊂⊂
9rz8≠4yz≡⊂⊂1`/ns z (cons y (plist x))))
q)
¬
Page 2-∃4 ∪2-5.2 DecEmber 5, 1977
**DRAFT** Atomic Sqmbols **DRAFT
*
defprop FSUBR
defProp is a version of putprop with no argument-evaluation, which is
sometimes more convenient for typing∞ For instance,
(defprop foo bar oftenwith)
is equivalent to
(putprop 'foo 'bar 'oftenwith)
remprop SUBR 2 args
(remprop x y) removes x's y-property, by splicing it out of x's property
list. The value is nil if x had no y-property. If x did have a y-
property, the value is a list whose car is the property, and whose cdr is
part of x's property list, similar to (cdr (getl x '(y))).
x may be an atomic symbol or a disembodied property list. Example:
(remprop 'foo 'expr)
undefines the function foo, assuming it was defined by
(defun foo (x) ... )
plist SUBR 1 arg
(plist x) returns the property list of the atomic symbol x.
setplist SUBR 2 args
(setplist x l) sets the property list of the atomic symbol x to l. This is
to be used with caution, since in some implementations property lists
contain internal system properties which are essential to the workings of
the Lisp system.
December 5, 1977 ∪2-5.2 Page 2-55
**DRAFT** Maclisp Reference Manual **DRAFT**
5.3 The Print-Name
Each atomic symbol has an associated character string called its "print-
name," or "pname" for short. This character string is used as the external
representation of the symbol. If the string is typed in, it is read as a
reference to the symbol. If the symbol is to be print'ed, the string is typed
out.
See also page 2-83 for some other functions which have to do with pnames.
samePnamep SUBR 2 args
The arguments to samepnamep must evaluate to atomic symbols or to character
strings. The result is t if they have the same pname, nil otherwise. The
pname of a character string is considered to be the string itself.
Examples:
(samepnamep 'xyz (maknam '(x y z)))
(samepnamep 'xyz (maknam '(w x y))) => nil
(samepnamep 'x "x") => t
alphalessp SUBR 2 args
(alphalessp x y), where x and y evaluate to atomic symbols or character
strings, returns t if the pname of x occurs earlier in alphabetical order
than the pname of y. The pname of a character string is considered to be
the string itself. Examples:
(alphalessp 'x 'x1) => t
(alphalessp 'z 'q) => nil
(alphalessp "x" 'y) => t
Note that the "alphabetical order" used by alphalessp is actually the ASCII
collating sequence. Consequently all upper case letters come before all
lower case letters.
Page 2-56 ∪2-5.3 DecEmber 5, 1977
**DRAFT** Atomic Symbols **DRAFT**
pnget SUBR 2 args
(pnget symbol n) returns the pname of the symbol as a list of fixnums
containing packed n-bit bytes. The legal values of n depend on the
implementation; in the pdp-10 implementation, 6 (SIXBIT) and 7 (ASCII) are
allowed. If this seems obscure, that's because it is. Example:
(pnget 'MUMBLERATOR 7) =>
(-311246236550 -351327625542 -270←33)
pnput SUBR 2 args
This is a sort of inverse of pnget. (pnput (pnget foo 7) flag) returns a
symbol with the same pname as foo. The symbol is interned if flag is non-
nil.
December 5, 1977 ∪2-5.3 Page 2-57
**DRAFT** Maclisp Reference Manual **DRAFT**
5.4 Interning of Symbols
One normally wants to refer to the same (eq) atomic symbol every time the
same pname is typed. Maclisp implements this through what is called the
obarray. The obarray is a hash-table of atomic symbols. These symbols are said
to be interned, or registered in the obarray. Whenever a pname is read in Lisp
input, the obarray is searched for a symbol with the same pname. If one is
found, the pname is considered to refer to that symbol. If not, a new symbol is
created and added to the obarray.
The representation of an obarray is a Lisp array. The first 510. (or
thereabouts) elements of the array contain lists which are buckets of a hash
table. The last 128. elements of the array contain the "character objects,"
symbols with 1-character pnames. (These entries contain nil if the
corresponding symbol has not yet been interned.) The character objects are
treated specially for efficiency. There are usually one or two unused array
elements between these two areas.
In order to allow for multiple name spaces, Maclisp allows multiple obarrays.
An obarray can be made "current" by binding the symbol obarray to the
appropriate array-pointer. See page 2-89 for details on how to manipulate
obarrays and arrays in general.
It is possible to have a symbol interned on several obarrays at the same
time. It is also possible to have two different (non-eq) symbols with the same
pname interned on different obarrays. Furthermore it is possible to have a
symbol which is not interned on any obarray, which is called an uninterned
symbol. These are useful for purely-internal functions, but can cause
difficulty in debugging since they can't be accessed directly. Such a symbol
can be accessed via some data structure that contains it, set up by the program
that created it.
Normally symbols are never removed from obarrays. It is possible for the
user to explicitly remove a symbol from the current obarray. There is also a
feature by which "truly worthless" symbols may be removed automatically (see
page 3-58).
Page 2-58 ∪2-5.4 December 5, 1977
**DRAFT** Atomic Symbols **DRAFT**
intern SUBR 1 arg
(intern x), where x is an atomic symbol, returns the unique atomic symbol
which is "interned on the obarray" and has the same pname as x. If no
symbol on the current obarray has the same pname as x, then intern will
place x itself on the obarray, and return it as the value.
remob SUBR 1 arg
The argument to remob must be an atomic symbol. It is removed from the
cuRpent obarray i@_AShAαK@~α
→g&/-lV"ε⎇dπ&F≤@λ
|X<\L∨+Hλ
M~<h
\:y0→H⊂:42H0z7vZqFE⊂λ⊂⊂⊂9↑vq7fλ4s0qXryydX42P:≠P0w<H)Vrl≤92yyZww9Pλ:40zλ6p|P_2P92Xp∧ iN kr lh∂CI∃HAS\4∀@@@AiQJ↓Ici@,ε&*R∧λL]9x@∞=→0→≠9P74[↔αEεB∧¬∃Gα{CgOL¬V⊗↑D∧ααα∧∧αααλ:T¬∩∧ λ≡Yx FB∧@
A↓`∂W⊂∧αε@yH⊂~≥wP0y→βuee@9ifL@A)QJ↓H'K≤εBαε≤,w.n]nBε@=<u∧Y(λ∀≤}3,-{λ∧8π2 the
q`G←αs⊃βOF{W3⊃∧∧&*πD∧ε␈∩
m⊗br∧
FF*∞,W>9_
is @∧AUKn0A`↔m_NL<[Y,Dλ≤v-\Y{∧∞z=~↓QHλλ∧∧≥~→$∞x;9$∞≠X;,T_8 P≥42P \3zvr[8∪⊂⊂λ*w4`.terned" means @QQChAβ##∃β≥K7∨bβ#πM∧s?P4R↓↓↓↓∧∪↔πd
εf∞<X ∧
{H⊂-o(λ⊂↔X0y0∩ay(@A%H βSF)βO↔≤¬vv"∧λ↔⊗?]\Vw"
_d∞ λ⊂~~2P⊂'→{P9l[q3vεB⊂⊂⊂⊂λ;tv&λ12P#Z{2w the pπCKJ↓mC@3.)βπM∧εFF*
xM≤z;X-Dλ_;LD≥z3
D~_=LT_(⊂⊃[x8 ob i@Q`4)α↓↓↓β¬∪?C↔↔#e↓βd¬↔> Hλ∧
~≥<d∞~→(∧
Y=h∧∞z;∪∧∞⎇_<NDλ≠⎇.Dλ≥z.Mλ≥~Tλ≤p-\αP⊂+_v:rP_w2εEλ⊂⊂⊂⊂≤97p2\αpieS as The Old$ @ khAS_@ASh↓SfAg∃ibOK⊂@A←d↓aci@¬∪?A∨.!1βSF)↓β[∞cW*
xAQHλλ∧∧≤≤[n<Y≡$
yH∃
(≠p⊗→⊂⊂;t[4∧ not be changed. If The secondarguMent is nil,
Tsibly internal
system properties.)
gensym LSUBR 0 or 1 args
gensym creates and returns a new atomic symbol, which is not interned on an
obarray (and therefore is not recognized by read.) The atomic symbol's
pname is of the form prefix number, e.g. g0001. The number is incremented
each time.
If gensym is given an argument, a numeric argument is used to set the
number. The pname of an atomic-symbol argument is used to set the prefix.
For example:
December 5, 1977 ∪2-5.4 Page 2-59
**DRAFT** Maclisp Reference Manual **DRAFT**
if (gensym) => g0007
then (gensym 'foo) => f0008
(gensym 40) => f0032
and (gensym) => f0033
Note that the number is in decimal and always four digits, and the prefix
is always one character.
Page 2-60 ∪2-5.4 December 5, 1977
**DRAFT** Atomic Symbols **DRAFT**
5.5 Defining Atomic Symbols as Functions
Atomic symbols may be used as names for functions. This is done by putting
the actual function (a subr-object or a lambda-expression) on the property list
of the atomic symbol as a "functional property," i.e. under one of the
indicators expr, fexpr, macro, subr, lsubr, or fsubr.
Array properties (see page 2-89) are also considered to be functional
properties, so an atomic symbol which is the name of an array is also the name
of a function, the accessing function of that array.
When an atomic symbol which is the name of a function is applied, the
function which it names is substituted.
defun FSUBR
defun is used for defining functions. The general form is:
(defun name type (lambda-variable...)
body...)
However, name and type may be interchanged. type, which is optional, may
be expr, fexpr, or macro. If it is omitted, expr is assumed. Examples:
(defun addone (x) (1+ x)) ;defines an expr
(defun quot fexpr (x) (car x)) ;defines a fexpr
(defun fexpr quot (x) (car x)) ;is the same
(defun zzz expr x ;this is how you
(foo (arg 1)(arg 2))) ; define a lexpr.
The first example above is really just defining a synonym. Another way to
do this is:
(defprop addone 1+ expr)
That is, an atomic functional property indicates synonyming. This can be
particularly useful to define a macro by an expr or fexpr, or even by a
subr.
December 5, 1977 ∪2-5.5 Page 2-61
**DRAFT** Maclisp Reference Manual **DRAFT**
The functions defProp and putprop may also be used for defining functions.
There is a feature by which, when a file of functions has been compiled and
loaded into the lisp environment, the file may be edited and then only
those functions which were changed may be loaded for interpretive
execution. This is done by compiling with the "E" switch, and then reading
in the source file with the variable defun bound non-nil. Each function
will have an expr-hash property maintained, which contains the sxhash of
the interpreted definition od the function. defun will only redefine the
function if this hash-code has changed. This feature is rather dangerous
since reasonable alterations tk the function defInition may not change the
sxhash and consequently may not take effect. BecauSe of its general
losingness, this feature is only available in the pdp-10 implementation and
sometimes not even there.
defun could have been defined by:
(defun defun fexpr (x) ;circular, but you get the idea
(prog (name type body)
; first, analyze the form, get arguments.
(cond ((memq (car x) '(expr fexpr macro))
(setq type (car x)
name (cadr x)
body (cddr x)))
((memq (ca`r x) '(expr fexpr macro))
(setq name (car X)
type (cadr x)
body (cddr x)))
((setq name (car x)
type 'expr
body (cdr x))))
(setq body (cons 'laebda body))
Page 2-62 ∪2-5.5 December 5, 1977
**DRAFT** Atomic Symbols **DRAFT**
; now, check for expr-hash hair.
(cond ((and defun
(get name 'expr-hash)
(= (get name 'expr-hash)
(sxhash body)))
)
; actually make the definition.
((putprop name body type)))
(return name)))
args LSUBR 1 or 2 args
(args f) tells you the number of arguments expected by the function f. If
f wants n arguments, args returns (nil . n). If f can take from m to n
arguments, args returns (m . n). If f is an fsubr or a lexpr, expr, or
fexpr, the results are meaningless.
(args f x), where x is (nil . n) or (m . n), sets the number of arguments
desired by the function f. This only works for compiled, non-system
functions.
sysp SUBR 1 arg
The sysp predicate takes an atomic symbol as an argument. If the atomic
symbol is the name of a system function (and has not been redefined), sysp
returns the type of function (subr, lsubr, or fsubr). Otherwise sysp
returns nil. Examples:
(sysp 'foo) => nil (presumably)
(sysp 'car) => subr
(sysp 'cond) => fsubr
December 5, 1977 ∪2-5.5 Page 2-63
**DRAFT** Maclisp Reference Manual **DRAFT**
Page 2-64 ∪2-5.5 December 5, 1977
**DRAFT** Numbers **DRAFT
*
6. Numbers
FOp a description of the various typeq of numbers used in Maclisp, see part 1.2.
6.1 Number Predicates
zerop SUBR 1 arg
¬
The zerkp predicate retuRns t if its argument is fiXnum zero or fLonum
zero. (There is no bignumzero.) Otherwisa it returns nal. It is an
errkr id the argumeft is not a Number,∧@A∪_AiQCPASfAA←ggS YJAg%O]`AMQ←kY⊂AEJ~(@@@@↓kgKH8~∀
∀4∃aYkM`@@@@@@@@@@@A'+¬H@bACIN~∀~(@@@@↓)QJAAYcg`AaeK⊃SGCi∀AeKiUe]f@↓hASLASif↓CeOk5K]h@↓SfAgQ`'∂&ce↓β?∪↔πS/⊃βS#∞p4)↓α↓↓βk/∪=1βvK1β'2β'QβO→βk↔⊗yβ?I∧s↔∨π&K[∃9αα'QβO→βπ9ε+@↔⊗}$εN2∞Mε*ε≡,w.n]nBεO4
f␈ Q$ααα∧∩εw]\&/∩aQ hPQ)VNw↑>ααα∧∧ααα∧∧ααα∧
5,∃$ε∩ε∂,qPPh$∧ααα
Mε*ε]≥g/∨∧∞π⊗.M≤6∂&T∞&/'↑-g~πD
⊗2ε≡N2ε∂,}Vn.nDεO~∀εv.|≡FO6T
g.n,↑"bεm≥BεNaQ"αα∧∧εO"
≡2αε∀ f}r]lV>∂M≡f*α
nVn⊗↑%bα∧≡DαεO4⊗rε↑.&␈∩∧
⊗"πMRαε≡,w.n]nBεO4∧εv␈D⊂hR∧∧ααεn]V⊗/%aPPh!Q&}&N∧ααα∧∧ααα∧∧ααα∧∧¬≥,*$β
ε≡,phPQ$ααα∧
FF*
xF'α∞∞&.&≤<↔&*∧∞&/'↑-g~πD
⊗2ε≡N2αε≡,w.n]nBεO4⊗rε|LBαεn]V⊗/%Dε␈&↑'>O<QPRα∧∧αεv≥Ebα¬MRε∂,}Vn.nDεo/>Dε⊗*∀ε&O
nVjε}$ε
ε-≤vw.UaPPh!Q hPQ!PPh!Q hTL\6.n,↑"β*Dε∪K;t∧ααα∧∧ααα∧∧ααα∧∧ααα∧α3∩kedααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα
⊗>*ε%S3(Q bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧ V∞≡M≡7α¬,\f/⊗]l6*∧\≥g.∞D∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hW=≤vwα∧∧ααα∧∧ααα∧∧αα∧j:T∃⊂Q!PRα∧∧α¬&Tπ≡N⎇nααπ∞,V&N<≡F*ε≡4π/≡\Dαπ&t∞F/∨D∞FF*∧∞6N>d
v2ε∀∧εw.\,W∩r∧¬π≡N⎇nααε4∂αHh$∧ααα∞,W'/-n2π"∧
⊗2π∧}2απ=≤vrπ<≡FO≡m≤W~πMRαπL↑7"ε5Dαεv≥DεN2
≡BαεM|W~εm}Brα∧∂αεO1Q"αα∧∧ε/6≥NV∂&\Dε↔/D2εO4
f␈"d∧¬&FT∞&/∨]NBεO4⊗g>∨≡2εv≥DεN2∂∧εO~
mw"ε∀∧εw.\,W∩r∧0hR∧∧ααε<≥bε⊗T
vv*
|bπ&Tε6}MMw>Nlw hPQ$ααα∧∧ααα∧∧ααα∧∧ααεD∧ααα∧∧εn.≥n2αα∧∂βcQ$ααα∧∧ααα∧∧ααα∧∧ααεLTααα∧∧ααα$∧ααα∧∂β`Ev↓PRα∧∧ααα∧∧ααα∧∧ααα∧Rαα∧∧ααα∧∧"αα∧∧απCV↓PRα∧∧ααα∧∧ααα∧∧ααα∧
bαα∧∧ααα∧∧"αα∧∧απCQ¬sh$∧ααα∧∧ααα∧∧ααα∧∧αε>T∧ααα∧∧αα∩∧∧ααα∂π`E{↓Q"αα∧∧ααα∧∧ααα∧∧αααtααα∧∧ααα∧$ααα∧∧πCs↓Q hR∧∧αα∧←⊗oεL↑3Ph$∧ααα∧∧ααα∞=⊗>w∧
F*αV∃∩βkd∞@hR∧∧ααα∧∧ααG=≤vwα
dβαJπWbεv≥APRα∧∧ααα∧∧αG≡≤⎇gαεt∧rF6⎇tαrε,≡"JJπWbεv≥APPh!Q&F∂]Mvv:∧∧ααα∧∧ααα∧∧¬≥,*$β
ε≡,phPQ$ααα∧¬εF∂]Mvv:∂¬∩π⊗↑NW⊗w4∞FF*
nVn⊗↑$ε}2∞=⊗>v≤m⊗≡∞nDε⊗ON4εNr∂¬bαπ∧6∞r,Rε
m↔Fw]QPRα∧∧αε␈$∩αε-≤vw.Udα¬&Tπ⊗/>]G"α
≡2π&Tαεf\≡7"ε≥nF.>↑$εv␈D∧εf/>4π&F≥dαπ&Tε⊗∂<US⊂h$∧ααα
Mv>∂-≡FFj
|bπg∂E3
pQ!PRα∧∧ααα∧λWF∞↑
F/≠!Q"αα∧∧ααα∧∧ααα
↔.f⎇lrβα∀πSrβ↓Q"αα∧∧ααα∧∧ααα
↔.f⎇lrβ~∀πSrβ!Q"αα∧∧ααα∧∧ααα
↔.f⎇lrαku∀βkrε1PRα∧∧ααα∧∧ααα¬
ε∂.M⎇f:β⊗&3#+fv∪∪≠FVc:JπWbβ#¬aPPh!Q hPQ!PPh!Q hPQ!PPh!Q hU≤v*β%Vc2α∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧α3∩kef∩αα∧∧ααα∧∧ααα∧∧ααα∧∧α∧&\<Vn⊗↑$β*bε↔∪;8Q bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧αα∧n]V⊗/.4ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hSef"α∧=⎇Wε∂-≡6}pQ!PPh'Tααα∧∧ααα∧∧ααα∧∧ααα
:T∃∩ε$ε∂⊗}1PPh$∧ααα¬πRπB∧∂∩Jε≡4απ"
≤bπB∧⊗v"∂∀αε∂,Tεw.\↑&N≡≥MGJε↑≡V∞bd∧απB≥f"α∂∀εo/>Dαε⊗T&␈&↓Q"αα∧∧ε6O
nVo~
}"ε⊗}Mαε6M⎇g.o5dα¬/<Tε/∂\≥Bπ&t6}o≡&*ε-≤vw.↑5`hPQ!PV?,\↔&/.∧ααα∧∧ααα∧∧α∧e:X%∩β$
w∩ε]}&*ε≡,w_h!Q"αα∧∧ε?⊗\≡F/↔∧6}o≡&/~
≡G~ε≡,w.n]nG~b∞⎇εN≡∧
W/∨D&*εn]V⊗/.5Bε7-⎇Rεf\nBπ&t∞&N>∞E`hR∧∧αα∧≤dε∞w∀↔⊗?]\Vw"
≡2εv}Dε?⊗\≡F/∩∞Mε∞r∞Mε*εl←π"b}&.∂L↑'απ,↑G/⊗n4εvNEdα∧↔↑DεN0Q$ααα∧∞FF*∧↔⊗?]\Vw'4∧π&z∧w⊗.≡LW↔α∧↔⊗*∞>G⊗N>MGJαLV∨⊗\≡6NvuDαπ&Tαπ⊗↑>Vg"∧
↔~πEaPRα∧∧α∧/≥Wεf↑7 hPQ$ααα∧∧ααα∧∧ααα∧∧αF?,\↔&/.∧β"β5∀βkr∞APRα∧∧ααα∧∧ααα∧∧ααα}&.∂L↑'αβ∀ε∩JβWdεvNAQ"αα∧∧ααα∧∧ααα∧∧ααF},V∂&↑.αβ"f∧β~sd¬S∩JπWbπ Q$ααα∧∧ααα∧∧ααα∧∧αF?,\↔&/.∧β"β4ε∩β∩ε¬∩βkd
fN`Q!PPh'dααα∧∧ααα∧∧ααα∧∧ααα
:T∃∩ε$ε∂⊗}1PPh$∧ααα¬πbπB∂∃∩εO4∞BεNd∂αεO4∧π∨'-≤7&g∀w⊗.≡LW∩πM⊗rπ∃Dε∞vD
fNb
}FF/.⎇↔≡*d∧πBα≥f"π⊃Q"αα∧∧εo/>Dε⊗*-w&Bm↔Fw]↑2ε␈$&␈&∧ff}n]W~pQ!PPh-LW∨∨∧∧ααα∧∧ααα∧∧ααα J5,∃$ε"ε␈$
V␈⊗T↔⊗?1Q hR∧∧ααεL↑7∨α=voε≡,W~ε≡N2αε≡,w.n]nG~b∞⎇εN≡∧
W/∨D&*α
nVn⊗↑.2bεn-vjεL\g"α∞Mrπ⊗≤⎇π"pQ$ααα∧ ⊗2ε≥o∩ε∂,}Vn.nDεO~
mw"εL↑7~α∞Mε∞r∞Mε*εl←π"b
LW∨∨∧∞&/'↑-g~εm≥Brαλ.W"α
≤bπ&QPRα∧∧αε∂,}Vn.nN2π&t
F/∨>∧ε∂⊗T∞7'⊗≤>FgJ
≥f∨⊗\≡6NvuDπ&FT∞&/∨]NBεO4∞Brαλ←ε∞o
LW≠PQ!PRα∧∧ααα∧∧ααα∧∧ααα
LW∨∨∧ε2β"∀πSrπAQ"αα∧∧ααα∧∧ααα∧∧ααFL↑7∨αε∀β
JπWbεv≥APRα∧∧ααα∧∧ααα∧∧ααα
LW∨∨∧¬S∩β5fbβ"∀πSrπAQ"αα∧∧ααα∧∧ααα∧∧ααFL↑7∨αε∧β∩β∀ε2β"∀πSrεm≥@hPQ!PPh!Q hPQ(F.≡]\&/∩εUBβ⊗vrαα∧∧ααα∧∧ααα∧∧ααα∧∧α↓≠%Vbs∩∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧¬ε∞|Tβ∩kfqPP**DRAFT** Maclisp Reference Manual **DRAFT**
< SUBR 2 args
(< x y) is t if x is strictly less than y, and nil otherwise. x and y must
be both fixnums or both flonums.
max LSUBR 1 or more args
max returns the largest of its arguments, which must be numbers. If any
argument is a flonum, the result will be a flonum. Otherwise, it Will be a
fixnum or a bignum depending on its magnitude.
min LSUBR 1 or more args
min returns the smallest of its arguments, which must be numbers. If any
argument is a flonum, the result will be a flonum. Otherwise, it will be a
fixnum or a bignum depending on its magnitude.
Page 2-68 ∪2-6.2 December 5, 1977
**DRAFT** Numbers **DRAFT**
6.3 Conversion
fix SUBR 1 arg
(fix x) converts x to a fixnum or a bignum depending on its magnitude.
Examples:
(fix 7.3) => 7
(fix -1.2) => -2
(fix 104) => 104
ifix SUBR 1 arg
(ifix x) converts x from a flonum to a fixnum. ifix will never return a
bignum, unlike fix. This allows it to be efficiently open-coded. This is
not the same function as IFIX in Fortran; rounding is down rather than
towards zero. It is like ENTIER in Algol.
ifix does not exist in the Multics implementation.
float SUBR 1 arg
(float x) converts x to a flonum. Example:
(float 4) => 4.0
(float 3.27) => 3.27
abs SUBR 1 arg
(abs x) => |x|, the absolute value of the number x. abs could have been
defined by:
(defun abs (x) (cond ((minusp x) (minus x))
(t x) ))
December 5, 1977 ∪2-6.3 Page 2-69
**DRAFT** Maclisp Reference Manual **DRAFT**
minus SUBR 1 arg
minus returns the negative of its argument, which can be any kind of
number. Examples:
(minus 1) => -1
(minus -3.6) => 3.6
haipart SUBR 2 args
(haipart x n) extracts n leading or trailing bits from the internal
representation of x. x may be a fixnum or a bignum. n must be a fixnum.
The value is returned as a fixnum or a bignum. If n is positive, the
result contains the n high-order significant bits of |x|. If n is
negative, the result contains the |n| low-order bits of |x|. If |n| is
bigger than the number of significant bits in x, |x| is returned.
Examples:
(haipart 34567 7) => 162
(haipart 34567 -5) => 27
(haipart -34567 -5) => 27
Page 2-70 ∪2-6.3 December 5, 1977
**DRAFT** Numbers **DRAFT**
6.4 Arithmetic
General Arithmetic
These functions will perform arithmetic on any kind of numbers, and always
yield An exact result, except when used with flonums. (Flonums have limited
precision and range.) Conversions to flonum or bignum representation are done as
needed. Flonum representation will be used if any of the arguments are flonums;
otherwise fixnum representation will be used if the result can fit in fixnum
form, or bignum representation if it cannot.
The two sections after this one describe other Arithmetic fqnctions which are
more efficient but less powerful.
plus LSUBR 0 or more args
plus returfs the sum of its arguments, which may be any kind of numbers.
differenc@∀@@@@@@@@↓→'+¬H@bA←HA[←e∀ACeOL~∀
∀@@@A⊃SMMKIK]GJ↓eKikI]fASQfAMSIghACIOk[K9hA[S9kfAi!JAeKMhA←L↓Sif@↓CeOk5K]if8@A∪h4∀@@@Ao←e-fAM←HAC]r↓WS]H↓←LA]U[EKeL\~∀~(~∃iS5Kf@@@@@@@@@@@A→'U¬$@`↓←dA[=eJACIOf~∀4∀@@@AiS[∃f@Ae∃ice]LAiQJAae←⊃kGhA=L@ASQfACe≥k[K]QfT@@↓∪hAo=eWf@↓M←dA¬]r@A-S]HA=L~∀@@@A]U[EKeL\~∀~(~∃ck=iSK]P@@@@@@@@@A→'U¬$@b↓←dA[=eJACIOf~∀4∀@@@Ack←QSK]h↓aKikβ∪;MβO#Eβ≠O∪OQβ∂∪↔W7,sQ↓β&K['∪.!βeπ##∃β⊗+OQβ|1↓β''→βπK?+7↔nN2ph$∧ααα
Mε*ε≤,w.n]nG
ε\∨∩ε∞o∀ε↑Nl@ε}2
nVn⊗↑%`hPQ$ααα∧∧αα∧←⊗oεL↑3Ph$∧ααα∧∧ααα¬∞↔.␈M_Vw"ε4β∩J∧πSrβ∀∧ααα∧π6&O
nVjεM~fO≡≥ybπ',Yf≡∂L↑2`h!Q"αα∧∧ααα∧∧αG∂]x
≤;]ε4K@_
P≡←⊂λ_W~Pλ≥q2`4 fdonum divisi@=\AI←∃`
β;|εB`! C"AQHλλ∧∧λλλ∧∧λ≤=-}~90↔≥⊂≠↔λλ_W~Pλ→↔_∀H≤[⊂→_εEεB ∧ec@∃[EKdα↓U "∧∪∪+hλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ∧lEVKM⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂(0sYP→⊗@71
α**DRAFT** MacliSp Re@→KeK]
JA7∞sWπD∧ααα∧∧ααα∧∧ααα∧∧ααααJQ
(1Q∃
∧¬α
add1 S@+ $@bAαC≤4Ph ∩α∧∧ααF≤LC
πα
(πWH≡αf∃β⊂⊂ 8 hCr↓EJAC9rAWSαs⊃β?2β;G\,W%C"C!arg
(sub1 x) => x-1. x may be any kind of number.
remainder SUBR 2 args
(remainder x y) => the remainder of the division of x by y. The sign of
the remainder is the same as the sign of the dividend. The arguments must
be fixnums or bignums.
gcd SUBR 2 args
(gcd x y) => the greatest common divisor of x and y. The arguments must be
fixnums or bignums.
expt SUBR 2 args
z
(expt x z) = x
The exponent z may be a bignum if the base x is 0, 1, or -1; otherwise z
should be a fixnum. x may be any kind of number.
As a special feature, expt allows its second argument to be a flonum, in
which case the first argument is converted to a flonum and the
exponentiation is performed in floating point, using logarithms. The
result is a flonum in this case.
*dif SUBR 2 args
*dif is a subr form of difference. It is documented here because some
people use it. There is no reason to use it, since the compiler
automatically converts difference into *dif as required.
Page 2-72 ∪2-6.4 December 5, 1977
**DRAFT** Numbers **DRAFT**
*quo SUBR 2 args
*quo is a subr form of quotient. It is documented here because some people
use it. There is no reason to use it, since the compiler automatically
converts quotient into *quo as required.
December 5, 1977 ∪2-6.4 Page 2-73
**DRAFT** Maclisp Reference Manual **DRAFT**
Fixnum Arithmetic
These functions require their arguments to be fixnums and produce only fixnum
results. If the true result, which would be returned by the more general
functions described previouslY, is too large tk be represented as a fixnum, the
result actually returned will be truncated to an implementation-dependent number
of bits, which is 36. (including the sign) in the Multics and pdp-10
implementations. The compiler produces highly-optimized code for these
operations.
+ LSUBR 0 or more args
+ returns the sum of its arguments. The arguments must be fixnums, and the
result is always a fixnum. Examples:
(+ 2 6 -1) => 7
(+ 3) => 3 ;trivial case
(+) => 0 ;identity element
- LSUBR 0 or more args
This is the fixnum-only subtraction function. With one argument, it
returns the number's negation. With more than one argument, it returns the
first argument minus the rest of the arguments.
(-) => 0, the identity element
(- 3) => -3
(- 5 3) => 2
(- 2 6 -1) => -3
etc.
* LSUBR 0 or more args
* returns the product of its arguments. Examples:
(* 4 5 -6) => -120.
(* 3) => 3 ;trivial case
(*) => 1 ;identity element
Page 2-74 ∪2-6.4 December 5, 1977
**DRAFT** Numbers **DRAFT**
/ LSUBR 0 or more args
This is the fixnum-only division function. The arguments must be fixnums
and the result of the diviSion iq truncated to an integer and returned as a
fixnum* Note that The name oF this function must be typed in as //, sifce
Lisp usepε@NA¬fAC\↓KgGCAJAGQ¬aCGi∃d\~∀4∀@@@A∪LAUgKHA]SiPA5←eJAQQC\A=]J@A¬eOk[∃]hXA%hAISYSAKf↓iQJA→Segh↓CeOk5K]h@↓ErAi!J~∀@@@Ae∃ghA←_@AiQ∀ACeOU[K@;'→9↓↓∧K⊃βW≤+⊃β←M#!↓β}s3eβ|¬f*α≡&/.\XNEλ~5∧∧≤Y=∞↑Xπ9P≥42FEλ⊂⊂⊂⊂→4|7:[P92aZx97qXv⊂7`& that jumber, @]QSGP↓Sf@ZDX@`XbP⊃β⎇⊃βWlLV&NlX ∧→<→-l~;YaQHλλ∧∧≠{@∞⎇→=~↑H≥~T≠];,,<H⊂∀\β %1 ha`%≥JP@b0A←d@@X~∧~(@@@@@@@@@@@@P↑NRz|@bαaβS#*β'β↔w#'Se∧∧Vf.\Yg"pQ$ααα∧∧ααα∧∧ααα∧¬αzzε&αrβU∀βkrεAPRα∧∧ααα∧∧ααα∧∧ααButββ¬`β~β%∀βkrε⊂
Ea"Hλ∧∧λλλ∧∧λλλ∧∧λ→55C"C!!"L*d∧λλλ∧∧λλλ∧∧λλλ∧∧λ∀u(
H ≡Yc"AQHλλ∧∧
"d∂
(∂'d≡
l%Dλ≡λ
↑<⎇λ,(_ ⊂→αixnum* The result is always a fiXnum.
1) SUBR 1 arg
¬
(1- x) => x-1. x must be a fixnum. The result is always a Fixnum.
\ SUBR 2 Args
(\ x y) retuRns the remaifder of x divided by y, with the sign of x. x and
y must be fixnums. Examples:
(\ 5 2) => 1
(\ 65. -9.) => 2
(\ -65. 9.) => -2
\\ SUBR 2 args
This subr of two arguments is like gcd, but only accepts fixnums. This
makes it faster than gcd.
December 5, 1977 ∪2-6.4 Page 2-75
**DRAFT** Maclisp Reference Manual **DRAFT**
↑ SUBR 2 args
↑ is the fixnum only exponentiation function. It iser than
expt, but requires its arguments to be fixnums, uses fixnum arithmetic, and
always returns a fixnum result, which will be incorrect if the true result
is too large to be represented as a fixnum.
Page 2-76 ∪2-6.4 December 5, 1977
**DRAFT** Numbers **DRAFT**
Flonum Arithmetic
These functions require their arguments to be flonums, and always produce
flonum results. If the true result is too large or too small to be represented
as a flonum, an arithmetic underflow or overflow error will occur. (In the pdp-
10 implementation these errors are not detected in compiled programs.) The
compiLer producEq highly-optimized code for these operations.
~∀,H@@@@@@@@@@@@@@A1'+¬$`A←d↓[←eJ↓CeOf4∀~∀@@@@V⊂AeKiUe]fAQQJAgUZA←L↓SifA¬eOk[∃]if\4∀∩∀@@@@@AqC5aQKfh~∀@@@@@@@@@@@@@P,H@h\D@f\BPR@z|jP→I h)↓↓α↓↓↓↓α↓↓↓↓α↓↓↓!Z!↓↓Ipεαβ
fTααk5fbJαπSbαk¬b⊂hR∧∧ααα∧∧ααα∧∧ααᬬ2"β%`
E∀∂/Hε%MHλ∧∧λλλ∧∧∞⎇≤M≡Z8;∧x8p∩CE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀∃I∀P⊂≡O⊂_↔_λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂≥tb→w:4j≡P2v"[p¬ft
λ
α
-$ LSUBR 0 o@HASOE∀ACeOL~∀4R↓↓↓↓¬##'Mαβ'Mβ&C∃↓β4¬F}w]P-⎇[≡(∞≡8]≤L≤⎇~3mdλ→]-l⎇~3meHλ∃m9Hλ∞↑y9⊂≥tz4λ7w6,H7w2FB⊂⊂⊂⊂λ0y3z[pp∞t id p¬Ki@,ε&w~∧
FF*
nVn⊗↑ nP⊂72YβatiOn. Otherwise, it p¬KiKβ∪;Mβ&C∀4$∧αααi↔.⎇λ⊂.⎇;9-nλ≠:-n<h∃
(≤Y.≡λ≠p∪λ842P_y3p∃@5K]iF8~∀4R↓↓↓↓α↓↓↓↓α↓↓↓↓αA5⊃¬βiy↓Aq↓1βSF)β'∪,sS'SJβ↔3↔n+;P4R↓↓↓↓α↓↓↓↓α↓↓↓↓αA5⊃β@I↓↓urβS#∃εs↔∂παM⊗}r
x D∂λπεEλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂
⊗R⊂≠_⊂→π
TP≡@> 4.5
λ (%$2.0 1.5 -3,6) => 3.⊃
etc,λ
∀~(~∀THα↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓α2≥*
I↓αβ?Iβn{K∃β∂∪↔L4Ph!↓↓α↓↓)⊃∧ε&/'↑-g
πMRππ-|G.∨D v $~=≤d<Y⎇-\8π:9K⊂⊂"|_vx6 %q:¬
(*$ 3.0 2.@@h\`$@z`9β⊃Q9@hQ↓↓↓α↓↓↓↓α↓↓↓↓BQ⊃↓Ys %↓ur↓Q9Eα↓↓↓↓α↓↓↓↓α↓oSKO3'π1∧≠πO∀hQ↓↓↓α↓↓↓↓α↓↓↓↓BQ⊃%↓iq↓E9α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓o'∪.sS'SJβ↔3↔n+;P4Ph(4(hP4*∪.≠↔7/⊃↓U1β e]]α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓↓→I5Ys!↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓α∧∨¬↓⊂i]\4P1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓∧kπ∂3O≠AαK.3↔K↔v≠∃α↔∞sWπ1α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~ ¬"Ph!Q hRt@ααα∧∧ααα∧∧ααα∧∧αα∧J:T∃∩∧∧ε␈∩
]w⊗*≡&/_Q!PRα∧∧α¬&
~2εO4∧π&FTff↑n]Rn}mK∩ε&≡m↔≡Nβ{@∧];XnM;{KD∧λ∪[nL(≥~≡λλ∃
(≠X-\(λ≠lD≥~~.1"Hλ∧∧λ→U-l⎇~3md≠=<nD_Y(∞O<→1∧
;H_.∀λπWR⊂9tg_rP&$\βp uses / as an esc@¬aJAGαCπKπ≥#↔I8hQ↓↓↓ααS#'~β∪G≠≥#'?9∧≠?7C/#↔Mβ&C∃βK.≠'CK}≠π1βL1β∨'6+9β?vceβ?v)βπK?+7↔≠"q↓α'2β↔'[,p4)↓α↓↓β7␈∪∃βSF9β?v)βπK?+7↔≠"aβ'Q∧∧FO6≤LW
πMRε6≡.7"ε/∀π&FT∞&/∨EaPPh$∧ααα∧∧ααα∧∧ααᬬr`4
(∂'d+@_⊂:42H4r2w≥4z<P→v2vr[:εE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀WR⊂~K_⊂P≡O⊂_↔→βE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∀↔WI⊂≠↔→∞⊂→W_M∀P≡Oλ→↔_εB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ∀∪WRλ_X_↔⊂→W_λ→↔_∀H≡←⊂_M↔~FEλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂→z1WεBεEεEUR⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∀ja)⊂P0y3CEαE⊂λ⊂⊂⊂∀UR⊂<
P≡←⊂≡∃XW_⊂⊂<⊂≠zyz⊂_2P0P→67w:[W⊂⊂*~2P92\zv:⊂~yP0v≥p|yP_P36'[:vWεBεEεETR⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∀ja)⊂P0y3CEαE⊂λ⊂⊂⊂∀VR⊂<
P≡←⊂≡⊗XW_⊂⊂<⊂≠zyz⊂_2P0@→67w:[W⊂⊂*~2P92\zv:⊂~yP0v≥p|yP_P367[:vWεBεEεE↔∩⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∀ja)⊂⊂0y3\FEεEλ⊂⊂⊂⊂↔∩⊂4yH:42P→67w:[Vsw6≡P2|8≠w2w:~pz4w[⊂3:w_z4ww⊂⊂*4→P34y≤z⊂0y→zvrw≥⊂⊂6z\z⊂12CE⊂⊂⊂λ⊂0P3≠7w:vK⊂:42H9rqw[2⊂6z\z⊂12H0P34↑7:vP
92x2Xz⊗⊂ H34|7≥vTV⊂_w2⊂:~2P92\zv:⊂~yFE⊂λ⊂⊂⊂0H367w≥vW⊂⊂∃7P90ZyrP0H367w≥vP:7H0P36≠w:vP≤7{ry⊂:yrH∀2|8≥⊂<⊂<JP7y⊂λ∀2|8λ∀∃∩εB⊂⊂⊂⊂λ<P∀6≠sP<∀JTWεEβEεEεBεEεEβEεEεBεEεEβEεEεBεE(0YrP→⊗M\⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∧Y⊗[↔
⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂"2qYvq2yλ~V⊂_N[[FEβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂':vX2y9Pλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*¬
εEεEβE≠↔~H⊂"|8≠w2w:~pz4w[⊂0w2λ&7sp\4z46H#:w1]4ww9CEαEεB9xy:λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ)ja)λ_P0y→FEεEλ⊂⊂⊂⊂
9xy:λ<∀P≡O⊂⊂0P→67w:[P;t4Xt⊂4yH⊂:42H9xzp\2P97[z⊂7sλ⊂:42H7:vq→y⊂<↔λ⊂⊂*4~yP4yCE⊂⊂⊂λ⊂6wy→P⊂0qXzy0z→P:40[⊂⊂∀2↑8:⊂<λ⊂_↔~JW⊂⊂*~2P⊂3≠v67{Zw3P1[r2V⊂λ;t4qZ⊂4yPλ2:rP≥7FE⊂λ⊂⊂⊂#[yx2i⊂9t7]v2⊂!→P;y4]82w~s⊂:4→P9xzXy2P9≠wz⊂7Y⊂0P!~sw:vH4yP2→yty2Y↔⊂⊂$]⊂4qFB⊂⊂⊂⊂λ2yyr[:4pv≠<P0@λ'2{z≠w⊂4j→y0z4[w⊗⊂;Zz4⊂⊂_x897\94pz→P892Xpzz4[w9P⊂→5y⊂4[:2sr\∧E⊂⊂λ⊂⊂:9≥w1pz~ww↔εBεA⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀2→s:w_9xy:λ∀7∀FB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀_9xy:P⊂λabq n)
(e@aah@dP↑↑@ bV@Q!CkY←9JA\R$@dRR$R~∀~(@@@@@@@@QIKMβ+9β≥KAEαC9β∨,∧W∂~⊃Q"αα∧∧ααα∧∧ααα∧∧ααα¬
F∞n,L∩αFl[π"HQ$ααα∧∧ααα∧∧ααα∧∧ααα∧¬ε≡}lDαBFL↑7∨α
lWG"}V/∨5⊃PRα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα¬'∨∂.B∩εr
lWG"∃⊃PRα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∞Dε?.↑>2JJ⊃Q"αα∧∧ααα∧∧ααα∧∧ααα¬∞↔.␈M≤Vw"¬∞εg/4w./>4αG∂]}FN.nDεrε}\W∨~∃⊃PRα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧ε"JJ⊃Q hPQ,WGα∧∧ααα∧∧ααα∧∧ααα∧
5,∃$ε∩ε∂,qPPh$∧ααα∧∧ααα∧∧ααα∧∧π@h$∧ααα¬WGα∂¬∩βkdPhPQ!PVf|tααα∧∧ααα∧∧ααα∧∧α¬≥X*"β
≡&8h!Q"αα∧∧αFf|tπBJπWbπ&Tεv∂N↑&∞b
Mv>∂-≡FFj
|bπBaQ hPQ!PPh!Q hPQ!PPh!Q hTL\6.n,↑"β*Dε∪K;t∧ααα∧∧ααα∧∧ααα∧∧ααα∧α3∩kefRαα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα
⊗>*ε%S;HQ bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧ V∞≡M≡7α¬,\f/⊗]l6*∧\≥g.∞D∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hSefbα¬N-⊗>}m⎇V/'-≤2∧7]l7&N⎇n0hPQ!PW≡≥dααα∧∧ααα∧∧ααα∧∧α¬≥X*"β
≡&8h!Q"αα∧∧αG≡≥dπBJ⎇↔6/4∞FF*∧∞G⊗N⎇⎇f}n↑N&N~∞=⊗v*
|bπBd∧πBα
≡2εNd∞&∞&≤≥g~r∧∂αεn∨∀αε⊗T⊂hR∧∧ααεm∨εw.T
w∩ε∀ff}n]Rph!Q hV=}2αα∧∧ααα∧∧ααα∧∧αα¬:X%∩β∀↔⊗8Q!PRα∧∧ααF=}2πB∀∞&/'↑-g~πMRε≡}=⊗v*
|bπBd∧πBε≡4εNr∞,⊗&N≥n2rα∂∧εn∂∀&*ε∀fOFn]Rαε}$ελh$∧αααmF}w]U`hPQ!PV∂L≥bαα∧∧ααα∧∧ααα∧∧α¬≥X*"β∩≡&?_Q!PRα∧∧ααF≡L⊗rπ∧∧πJJ∞,W'/-n2απMRε∂,>F∞v|]g"α
|bπB␈∃BεNd∧π⊗∞M≤⊗w~d∧πBα≥f"π∀∧εn∂∀&(h$∧αααm↔Fw]↑2ε␈$ff}n]W~r∧∂∩εn∨∀ε⊗*ε∧ε∂~
Mvv:≡2πB
≡2εv}Dε∞g=tβαpQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ*ε∞>Tε"kC∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α↓≠%Vbs2∧∧ααα∧∧ααα∧∧ααα∧∧αααλLV≡.\,W∩βUDβKvqPPbR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧αα∧n]V⊗/.4ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hSefrα¬,≥f&}Tλg.v>M⊗}w1Q hPQ.&∞vM⎇Rαα∧∧ααα∧∧ααα∧ E≥,*$βαπ fixnum.
(random nil) restarts the random sequence at its beginning.
(random x), where x is a fixnum, retqrns a random dixnum between 0 and x-1
inclusive. A useful function is:
(defun frandom ()
(//$ (flkat (random 10000.)) 10000.0)))
which returns a random flonum between 0.0 and 1.0.
(random n⊃ n2) sets the random number seed from the pair od integerq n1,
n2.
¬
zunderflow SWITCH
If an intermediate or final fhonum result in the interpRetive arithmetic
functions (times, *$, expt, etc.) is too small in magnitude to be
represented by the machine, corrective action wilh be taken according to
the zunderflow switch.
If the value of zunderflow is non-nil, the offending result will be set to
0.0 and computation will proceed. If the value of zunderflow is nil, an
error wilh be signalled. nil is the initial value.
In the pdp-10 implementation compiledcode is not affected by zunderflow if
the arithmetic in question was open-coded by the compiler. Instead,
computation proceeDs using a result with a @ S]CedAKqa=]K]hdjl@↓QSOQ∃dAiQ¬\~∀@@@Ai!JAG←IeKGh↓Kqa←9K]h\α↓α'9αβS#∃∧kW3SL≠@~ε≥↑εf.\Yg&∂M≥vrπ.Yf&/,mF␈:∧∞v␈⊗>4π&FQQ"αα∧∧π≡∞\Tε6←$6}o
→F."9v&*≡2ε6} εNwL↑'π⊗↑LV"ε=x UC"C!$λλλ∧
y9(¬∞|⎇_.N<h→
≡Y⎇J%D≥z~,=λ_smn≤[{∞P24{~ytwwλ1<P-→y3P∀≤0y2U≠TWβE
α
DeCembe@H@jX@Drfn@@@@@@@@@@@@@@@@@LdZl\\@@@@@@@@@@@@@@@@@@@@@@A!¬OB@DαiaD∀P1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓∧kπ∂3O≠AαK,3↔K↔v≠∃α↔∞sWπ1α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓ T"Jε~ ¬"Ph!Q hSecαα∧M|vN≡≥D∧oε↑,↔&N⎇n2ε}d g.n,↑'λh!Q hR∧∧¬&F↑8Rαεn]f∨&≥⎇g~α
\↔Jα,Rαπ↑8V"εn,V.g∀∧ε6←$∧ε⊗OD∧εn∞m_∞]_=~-⎇Nhλ∞M→(⊂m⎇<~3↑C"TL\{y{M∨Y<h∞M→; ⊂_w2⊂8≤7r:aYyP2s→4qtr[:⊂1gY2WεEβE17w[2P⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂&)jP)⊂→P≠y⊂6w\2P0y→yFEεB⊂⊂⊂⊂λ∀17w[2P5@≡⊂<TP_wvx:]2yP0H14r⊂_<P14]⊂!7w[2pw→:w1j~ww⊂7Yα the fixnums x and y
under @QQJAGα{;SK}aβ/→εY9↓βZβ7WO"↓β∃ε β≠'FsW5β⊗+SO↔,q↓Aβ∞s⊃↓E:↓↓#?∨#π1¬p∧α∧NaQ"αα∧∧π&FT∧ε⊗Nl≡'Jπ,↑π⊗/<Yg&∂M≥vrα
xbεZ∧
↔4λ_8L<λ∃
;Hλ∞M→(≥∞∞=~λ∧∞_8[Tλ→Sn⊂:42CE⊂⊂⊂λ⊂!7w[2pw≠x2y0]4ww~y]εEβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ<@
←←←←λt←0λ←←←1λ←
0| a c
x |
1l b d
α IF booLe has mgre than three a`%≥k[K]QfPASPAO←KLAMe←4AQKMPAi↑AISOQhlAiQkL~∀4R↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓β⊗{?3∃εYβaβJβi%↓h↓#∨}c∃β-αC??d)β-β@βe%βRH4(∀R↓↓↓↓¬##∃βn{OQβ≡{77?rβ[π3.+Eβ≠⎇⊃β-β∂∪∃↓EαCπ;⊃Ja↓]↓F{I%1β1↓#c⎇⊃%)↓¬K?Uβ≤∧⊗rε|ZBπ&QPRα∧∧αε≡⎇↑εf.\]g"b
}"εf|⎇⊗≡∞DλL\x=~-⎇Kλ∪lD≡λ_O∀λ∧17[v2P≠λ<⊂⊗XJWεEεB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂*42H37v&≠{tw3H6pqy≠yP0y→P7s:→w⊂1`/nvenient:
α (defun lOeandmacro (p)
(subst (cdr x) 'f '(bgole 1 . f)))
¬
(defqn logor macro (p)
(subst (cdr x) 'f '(bgole 7 . f)))
(defun logxor macro (x)
(subst (cdr x) 'f '(boole 6 . f)))
Page 2-82 ∪2-6.8 December 5, 1977
**DRAFT** Numbers **DRAFT**
Alternatively, these could be defined with macrodef (see part 6.2):
(macrodef logand x (boole 1 . x))
(macrodef logor x (boole 7 . x))
(macrodef logxor x (boole 6 . x))
lsh SUBR 2 args
(lsh x y), where x and y are fixnums, returns x shifted left y bits if y is
positive, or x shifted right |y| bits if y αis negative. Zero-bits are
shifted in to fill unused positions. The result is undefined if |y| > 36.
The number 36 is implementation dependent, but this is the number used in
both the Multics and pdp-10 implementations. Examples:
(lsh 4 1) => 10 (octal)
(lsh 14 -2) => 3
(lsh -1 1) => -2
rot SUBR 2 args
(rot x y) returns as a fixnum the 36-bit representation of x, rotated left
y bits if y is positive, or rotated right |y| bits if y is negative. x and
y must be fixnums. The results are undefined if |y| > 36. As with lqh,
the number 36 depends on the implementation. Examples:
¬
(rot 1 2 => 4
(rot -1 7) => -1
(rot 601234 36.) =6 601234
(rot 1 -2) => 2⊂00000000 0
(rot -6 6) => -501~∀4∀∩¬)!JAM←1YP∨←Ls≥β≠,∧↔'∂,Tε}vO∀ε/F≡>G4~;@∞M→(∀N($∧
;<≠]9;]≡~;{EA C"D∧λλλ
M→(∩-n→<[L≥λ≤Y.∞Y<q-n_9~-⎇H≠p∪λ367w≥vyP6X|P12H40quYp⊂:yZw3P*~2yrP→8s1j~ww9WβE⊂⊂⊂λ⊂69tλ5y⊂ 2ot applied to a flOnum operates oN the internad pepres`]i¬iS←\↓←L~∀@@@AQQJ@A→YW]k4ACMHAeKiUe]fA∧@AMSa]kZ@↓eKgk1h\@A→←d@A∃qCKa1JX@Q1cP@@@\j@@@R@z|4∀@@@@d``P````@```@!←GiC0RP→↓¬##∃β4¬vff}⎇⊗v:nVv∨M≥vrε≥N6zε←
↔∨'7!PPh!Q$&.<YV⊗/$εRbβ↔⊗s:α∧∧ααα∧∧ααα∧∧ααα∧∧αα↓6%S2s∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α¬ε≤|Rβ∩Wε0hPbR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧ V∞≡M≡7α¬,\f/⊗]l6*∧\≥g.∞D∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hVn<2αα∧∧ααα∧∧ααα∧∧αα¬:X%∩β$↔⊗?1Q hR∧∧αααn6~α∂∧πJJ∧∞ε/⊗m}&o~∀α∧584εNw>N'.∨M≥vrα
⎇bπ&Tαπ'⎇tεw.\,W↔~∧∂αε∞lDαπJD⊗v Q$ααα∧∞&/'↑-g~πMRπ⊗↑>Vg"≡2ε
mF}w]Ubα∧=⎇g∨.NDπ&FT∞ε'αV⊗αππ-|6/∨=}"εn≥nV∞b
≤bπN}QPRα∧∧απ>≥nBπ&t∞W≡*∞MεO~aQ hR∧∧ααπ∧∧ε∞vD∧πJα∧
V∂J∧&*αm↔Fw]↑2αε}$ααεmMvw.↑72αεn<2αε.↑7"α∞↑6/~∧∧π&FT∧εn∞=
⊗v(Q$ααα∧∞&/π,↑6.wL≡FN}n4ε}2∞Mε*εn]V⊗/.5bα∧≤dπJε≡4ε?⊗\≡F/∩∞Mε∞rεvs;;vtε}∨L≥BbπMR∧581PRα∧∧αεNn>G↔.>M⊗}r
≡2ε}]≡G&.D⊗v"∧∞FF*∞
w∨≡≤-GJo]mf␈⊗\≥FOV\Dε6f⎇nVjπ⎇≡FBα∞Mε*π<≥V(h$∧ααα
\⊗≡F≥lRπ⊗↑∞&/≡]nF∂&≥⎇bε∂4∂αεO4∞&/'↑-f."aQ hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh*⊗>*ε%SC"∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧↓≠∩VecBα∧∧ααα∧∧ααα∧∧ααα∧∧αα∧L\6.n,↑"β*Dε∪K;qQ **DRAFT** Chabacter ManiPulation **DRAFT
*
7. Chabacter ManiPulation
7.1 Character Objects
¬
An atomic symbol with a one-chabacter pname is often called a character
object and used to represent the ascii character which iq its pname. In
a`dition the atomic symbol with a zero-length pname represents the ascii null
character. Functions which take a character object as an argument usually also
accept a string one character Long or a Fixnum equal to the ascii-code value for
the character. Character objects are always interfeD on the oBarray (see page
2-58), so they may be compared with the f@U]GiS=\AKb8~∀
∀4∃CgG%R@@@@@@@@@@@A'+¬H@bACIN~∀~(@@@@QCgG%RA`R0AoQKIJApA%bABA9k[EKHXAeKQke]f↓iQJA
QCeC
iKdA=EUKGPAM←dAiQJ↓CgGS$~∀@@@AG←⊃JAp\4∀~∀@@@AaC[aY∃ft~∀4∀@@@@QCg
SR@b@bR@zxAα~∀4∀@@@@QCg
SR@jXR@z|↑\~∀4∀~∃O∃iGQCH@@@@@@@@@@A'U¬$@d↓CeOf4∀~∀@@@@Q≥KiGQ¬dApA8RXAo!KeJA`ASfA¬\@ACQ←[SF↓gs[E=XAC]⊂A\ASLABAM%q]kZ0@AeKQke]f↓iQJ~(@@@@↓\OiP↓GQCe¬GiKdA←LA`OfAa9C[JvA\@zb@Ag∃YKGiLAiQJ↓YKMi5←gh@↓GQCe¬GiKd8@A)Q∀~∀@@@AGQ¬eCGi∃dASf↓eKikI]KHA¬fABA
QCeC
iKdA=EUKGP\@A]%XASf↓eKikI]KHA%LA\@¬SfA=kh~∀@@@A=LAE←U]If\4∀~∀~(~∀~∀4∀~∀~(~∀~∃⊃KGK[ Kd@j0@brn\@@@@@@@@@@@@@@@@@&dZ\\@@@@@@@@@@@@@@@@@@@@@@@↓!COJdZpj4∀_TU Iβ
(T(@@@@@@@@@@@@@@@A5CGYSM`A%K→KeK]
JA≠C9kCX@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∃OKQGQCe8@@@@@@@@@A'+ $@dA¬eOf~(~∀@@@AOKQGQCe8ASfAQQJAg¬[JACLAOKi
QCdA∃qGKaPAiQCPAiQJ↓GQCe¬GiKd↓SfAe∃ike]∃H@ACLAB~∀@@@A→Sq]k4AS]gQKCHA=LABA
QCeC
iKdA=EUKGP\~∀~(~∃[C-]CZ@@@@@@@@@@A'+ $@bA¬eN~∀4∀@@@A[CW9CZAi¬WKfA¬fASiLACeOU[K]h↓BAYSMhA←L↓GQCe¬GiKeLAC]H↓eKikI]fAC8Ak]S9iKe]∃H~∀@@@ACQ←[SF↓gs[E=XAoQ=gJAa9C[JA%fAG←9giek
iKHA→e←ZAQQJAY%ghA←_@AGQ¬eCGi∃ef\@↓)QJ~(@@@@↓GQCe¬GiKeL@A[Cd@AEJAeKaIKgK]QKH@A∃SiQKHACf@↓MSq]U[f@@!CgGS$@AG←⊃KfR@↓←dACL~∀@@@AGQ¬eCGi∃dA←E)KGif8@Aq¬[aYJh~∀~∀@@@@@@@@@@@@@@@@@@@@Q[CW9CZ@N!BAD@X`AHR$@z|A¬DaH~(~∀~∃%[aY←⊃J@@@@@@@@@@AM+¬$@DACeN4∀~∀@@@AS5aY←I∀ASfAQQJ@AMC[JA¬fA[C-]CZA∃qGKaP@AiQ¬hAiQ∀AeKgUYiS]≤ACi←5SF@AMs[E←0ASf~(@@@@↓S]iKI]KH\A∪hA%bA[←IJAKM→SGSK9hAiQ¬\AI←%]N@Q%]iKe8@Q[C-]CZA`RRXA¬YiQ←UOPASP~∀@@@ASf↓YKgf↓KMMS
SK]h↓iQC\↓aYCS8A[CW9CZAo!SGPAMQ←kY⊂AEJAUgKHA]QK\@↓S]iKI]S]N↓Sf~∀@@@A9←hAe∃ckSe∃H\~∀4∀~∃e∃CIYSMh@@@@@@@@@A'U¬$@b↓CeN~(~∀@@@A)Q∀ACeOU[K]h↓i↑@AIKCIY%ghASLABAY%gh@A=HAGQ¬eCGi∃ef\@↓)QJA
QCeC
iKefA[Cr↓EJ~∀@@@AIKaeKMK]iK⊂AKSi!KdACLAMSq9k[f@QCgG%RAG←⊃KfRA=dACf↓GQCe¬GiKdA←EU∃Gif\A)QJ4∀@@@AGQCICGiKIfAS\↓iQJ@↓YSgh↓CeJA¬ggK[ YKHA%]i↑@↓C\A&5Kqae∃ggS←8ACfA%L@Ai!KrAQ¬H~∀@@@AE∃K\AieaKH@↓S]i↑↓eKCH@QgK∀AaCeP@j\b8R@A∪_A[CGI↑@AG!CeCGQKefA¬eJ@AUgKHX↓C]r~(@@@@↓kgCO∀AS\AQQJA[¬Ge↑A
QCeC
iKdA→k]Gi%←\A←_AeKC⊂XAeK¬IGPX↓isRX↓←d@AQsSaK∃VA]←P~∀@@@AKqAYSGSQYrAgAKGSMeS]NA¬\AS]Akh@A→SYJAQCWKf↓S]akPAMe←4@AeK¬IYSgQfOfA¬eOk[∃]h~∀@@@AICiQKHAiQC8AMe←4AC\A$←≡AI∃mSGJ↓←dAB↓MSYJ8@A)Q%fAGCUgKfA5CGe↑AGQCICGiKIbAi↑4∀@@@Ao←e,ACfAe←jAo=kYHA∃qaKGP\~∀~(@@@@@@AaC[aY∃ft~∀@@@@@@@@@QeK¬IYSgP@NQB↓DAFR$@z|A¬EF~∀@@@@@@@@@QeK¬IYSgP@NP@<PA`AH@bjb↓\Ah@<@@↑N↓LA↑A<@↑R@$R~∀@@@@@@@@@@@@@t|@QaIS]h@!ck←i∀AM←↑$R@@w¬gGSRbbb@t@ERD4∀~∀@@@A≥=iJAi!JAkg∀A←LAQQJAg1CgQS→SKHAMaKGS¬XAGQ¬eCGi∃efAY∃Mh@AACeK]QQKgSLXAga¬GJX~(@@@@↓ck←i∀XAeS≥QhAa¬eK]i!KgSf↓S\Ai!JACE≥k[K]PAi↑AIKCIY%ch\~(~∀~∃ACOJ@HZpl@@@@@@@@@@@@@@@@@@@@@@&dZ\Xb@@@@@@@@@@@@@@@@A ∃GK[E∃d@jXbrnn4∀_TU Iβ
(T(@@@@@@@@@@@@@@@@↓∂#πα,⊗∨&↑ λ \8π4`0ula`)%←\@@@@@@@@@@@@@@@@@)T"Jε~ ¬"PH!Q hV←∞εf@y→(∧∧λλλ∧∧λλλ∧∧∀p
a∀⊂_P !pg
λ∧@@@@QKqAYP∨∪*βa%↓∧ε&/'↑-g4_(⊂⊗~yz⊂⊂≠q⊂1`(arac@QKefX↓oQSGαA↓βπα,Rπ~→(∧z_<L≤⎇→0→≤β thatλ
)α↓↓↓β>{W3⊃∧∧&*πLε0_→p∧ @=khASα1↓#C⊗K9Eβ@¬∩απ|XLT→≠p↔→T∧ i@9GYkI%]NAgαcπO#,ε2αεmxD∞|→0⊃Zpp
cha`%¬GiKeLAEkhαβ; ?Dλ
-l{_
`$ing @∃q`∪Kλ∧εv/⎇H
-l<h⊂∀[9ry:→p∧ to preventcha`%¬GiKeL~∀@@@AMe=ZAe@,¬fvNβY`⊂λ4πff the p¬SOQPASCe≥S\\@AβCG AGQCICGiKβ⊃↓β'~β@⊗/∞,W∞9]→,Dλ_↑$ εE⊂λ⊂⊂⊂!Z0y0q]2y⊂ /bjecT,∧@AaC[aYα)`⊂H!Q"αα∧∧ααα¬WGεMxF*αu↓2α{⊗ β~J∀πSrα∧¬rBα4¬rααutαk
∧¬s∩αt∧αk~¬u∩αHβ"H∧∧λλλ∧∧λλλ∧∧λλλπ→β3p∀e the presEnce od∧AgY¬`∂#'4K↔↓β∨βπ∂↔~β'9β&C'MβdK@∨"aQ hPQ( /∞≠≠q\hλλ∧∧λλλ∧∧λλ∀jXTH$<Yc!! ¬⊂⊂λ⊂⊂∀2↑867b→qP<∧H⊂92z≥y0∞s a liSt oF characterpεAoQ%GP@A¬eJAi!J@AG!CeCGQKefAQQCh~(@@@@↓o←kY⊂AEJ@↓isaK⊂A←kh↓SL@@!aeC]ApBA]KeJ@↓I←]J0A]←h↓S]GYUIS]Nα↓β↔c'∪¬β;-;3';-_4)↓α↓↓β'w≠↔KS.!βS=πβK↔[,sQβ∂FKπ∂&+KMβ7∪?5β↔+;;'v9β?≠2βS#∃π∪'∨#"↓β7π⊗;'99ααOC↔≤Kπ04R↓↓↓↓ε≠#πK∞≠S↔K~↓βπK*↓β;?"↓βO3∂≠#'≠N+⊃9↓αα↔π∂B↓β∂#∂∪π∂S/⊃↓β'~↓βK↔π∪↔O↔w#↔⊃↓ε∪e↓βλh)↓↓α↓β∂#∂∪π∂S/⊃β?V+∂Q9αα↔cπoβ3∃hhP4)↓α↓↓↓↓α↓#↔cεc?∪↔~↓≥!-αyEI↓~I%↓ur↓!↓=@↓-↓=α↓=E↓{⊃↓=↓αyM↓≥J↓$4(hP4+↔Gβ3?∪.q↓↓↓α↓↓↓↓α↓↓αN,∩I↓E∧K≤4Ph)↓↓α↓↓#↔Gβ3?∪.qβa%αβK↔S-∪;Mβ
β3'O"↓β?→ε≠#πK∞≠S↔K~β←#'≡A↓βπ⊗)βS#*↓β∂#∂∪π∂S-∪EβSFP4$∧ααα∞⎇w.fDλ&*α∞O↔ε.D
w/"
≤bαα∞∞&Nv4∂αJπ|↑&*αMvv*D
f␈"
≥f≡g\M⊗v:∧WGπ,∀εv/⎇M⊗v/1Q"αα∧∧εNw<XNL9λ≥
t≤≤Y.l;]λ=_8X,>→<\d\[{$∞];[M≥Yh≠llH≥~T≤Z9m∞λλ≠,≡Yz;Edλ∀t\z8;↓QHλλ∧∧_z_.,er
which is the ascii code for that character. cf. explodec. Example:
(exploden '(+ /12 3)) => (50 53 40 61 62 40 63 51)
flatsize SUBR 1 arg
(flatsize x) returns the number of characters prin1 would use to print x
out.
December 5, 1977 ∪2-7.1 Page 2-87
**DRAFT** Maclisp Reference Manual **DRAFT**
flatc SUBR 1 arg
(flatc x) returns the number of characters princ would use to print x out,
without slashifying special characters.
Page 2-88 ∪2-7.1 December 5, 1977
**DRAFT** Character Manipulation **DRAFT**
7.2 Character Strings
These character string functions only exist at present in the Multics
implementation of Maclisp. A predicate to test if your implementation has these
functions is
(status featuRe strings)
These fUnctions all accept atomic symbols in place od strings as arguments;
in this case the pname of the atomic symbol is used as the stping∞ When the
vAlue od∧A←]∀A←LAQQKgJ↓Mk]GQS←]f↓SfAI∃cGeS KHACLABAgQaS]N0AShA%bACY]Csf@↓BAgiIS]N~)C]HA9KmKd↓C\ACQ←[SF↓gs[E=X\@A¬Yg↑AMKJAi!JAMk9GiS←9fA←\↓aCOJdZjl8~∀
∀4∃GCi∃]CiJ@@@@@@@@A→' $@`A=`A[←IJACE≥f~∀~(@@@@↓)QJA¬eOk[∃]ifA¬eJAG!CeCGQKdAgQaSMOL\@@AQQJAe∃gkYh↓SfAB↓cieS9NAoQ%GP@A%`
βπf`4)↓α↓↓βSF)βπK?+7↔nN2ε≡⎇l6∂&]l↔&.D
F}≡↑Mε/∩d∧∧/F≥↑εf+!Q hR∧∧ααα∧∧ααα8λ.L9X=TλY[mtHλK$$λXX.$J(∂'dλYSmu8X<D↓ C"AQX;Y←λλλ∧∧λλλ∧∧λλλ∧∧∀q0J$H⊂⊂\3yFEβE⊂⊂⊂λ⊂4w2→|⊂4yH64urH:42P∀&∪dP_:pv*~w⊂3 5nctiOn index. The arguments are c@!CeCGQKd~∀@@@AMieS]≥fT@AQQJAa=cSiS=\@A←_AiQJ↓ISegβ!β/∂≥+KK↔v≠∃↓β|1βS#*βO.=yf"α≡& >;93ND~;C!$λλλ∧∞~→(M<\p~λ4yP9→z:y7→r⊗⊂'\⊂_⊂4Y⊂:42\2P4`3 none. ExamplEq:¬
(index "foobar "ba ) =x@h~∀@@@@@@@@!S]IK`@EM←=ECdDAECtλR@z|`~∧@@@@@@@@Q%]IKpAO←← CECE∧D@EE¬DDR@t|@h~(~∀
∃β≠SK'v;3↔≠?#!↓↓α↓↓↓↓¬~V
Iβ βπK8h(4 α↓↓↓α&C∃βπ⊗;W7↔w!↓βSzβOSKNs∨3↔v;S!βo+OQ↓ε∪∃β¬ε≠#πK∞≠S↔IαβOSKNs≥9↓¬##∃↓εsW7-⊃β/_hQ↓↓↓αβ∂#π⊗∂S↔↔→β'9εKQβ'~βK↔S-∪;↔⊃r↓α↔c∞kC#↔≠P4(Q$ααα∧∧ααα∧¬π∨'-≥f>f]lw&B∧,f}z%∀βkrε1PRα∧∧ααα∧∧ααG>N&Nv⎇HVv?Mα$J(∂'dβ"AQA"C!! Q→,<;8Y.$
+λε↔-m`∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλα6K-kF$λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∀≤y(EW∞#"@↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∪,≤{~4n∧∀Y9L↑Y;XlT⊃8;N\;λλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λJQ
(1U∃
εEεEβE9za≤z9⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂&)jP)⊂⊃ or # argc
α This iS like the PD/I substr builtiN. (substr x m n) @IKike9bAB@↓cieS9JA\~(@@@@↓GQCE¬GiKeLAY←]≤XAoQ%GPASLABAaα{@↔ε≥⎇bε↑d
FF*∞>G-9Y`⊂≡⊂12sZw74`.e wi@QPASiLARO@&@4)↓α↓↓β∂FCπ∂&+Aβπv!βCK|∧6.∞M→f*εmz"εR8
≡X8u↑\k@∧
(_;LD≠H≠.↑⎇λ⊂LT→Z6
n;<k∧∂λ≠=.>β"H∧∧λλ⊂LT_(⊂→]94w3KεAεEλ⊂⊂⊂⊂
9zq9]9⊂<≠TP92]8¬rns the portion Od∧AiQ∀@AgiIS]NA`AEKO%]]@'v9βO'&A↓β''→β%∨αMhR∧∧ααε=↔,8⎇→.∧_;Y∧{{]
≥]:0↔→β until the end kf The stp¬SMNαq↓α↔F7C3/→h$λhQ↓↓↓α↓↓↓↓α↓#OW↔≠SI↓⊗3??∂⊃↓↓Mβ⊃%↓ur↓/ ⊂h)↓↓α↓↓↓↓α↓↓#O.∪OSIα∪K↔O.cS'Wv;↔I β1%↓ur↓C7.s∨↔I⊂h(4(hS∨πR␈β;π7*↓↓↓↓α↓↓↓↓ααNV
∩↓Eβπ⊗84(∀R↓↓↓↓αC∨↔R␈β;π7*βa%β⊗+SGKw→βS#*βC;πn)β?→αβaβπ~β¬β∂FKπ∂&+IβO'∪';≥r↓βaβo+OQ↓ε∪∃βπph)↓↓α↓βπS}k'
β∨K7?bp4(∀Ph+7π↑*␈πS}i↓↓↓α↓↓↓↓α↓αNV∃⊃↓Eβ∂∪≤4(hQ↓↓↓αβ7π/-{πS?jβK↔S/∪;Mβ∞qβπS}k'
β∨K7?ba↓βWvK;S↔⊗s↔⊃1π;#?O*βC;πn)β'Mε;'[↔r↓βπMελ4)↓α↓↓β∂FKπ∂&+IβO'∪';≥εK∨Wn+;Q9αα↔cπoβ3∃hhP4)↓α↓↓↓↓α↓↓↓#n/⊗␈∂#?5↓⊗3?= J↓uyβ6{=↓↓α↓↓↓o>C'∂!εKEβ;␈!β↔Eπ#=β∧hQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓o≠?zβS#π"β'Mβ⊗+π⊃βNq84(hP4(4Ph(4(hP4(4Ph(4(hP4(4Ph(4(hP4*C∞;∃↓IkIA↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓↓→I5]s⊃↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓α∪↔≡+7↔∩↓U1↓I]\4P1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓α∂∪Kπg~↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~ Q(4(hP4(4Ph)a9ααπKK∂KL4(hP4)↓ααπMβ-CC3πNs↔⊃βLqβCπ↔!↓E9∩aβπ9εKKπJβ'Mβ
β∨K?/↓β?→ε≠↔33~β←#'≡Aβ7πJβ∂?;&'9αfKG@4T{+↔∨#M)↓¬##∃βL¬f&Om_ ∞\;λ⊂⊃Yv69P_y2P9Yv2q`4ed by numepical subscri`tq*
An array i@L@AIKMSO]CQKHAEdABAgAKGSC0@ACi=[SFA=EUKGPAGCY1KH@A¬\ACeICr[a=S]iKHX∩∃βIaCr[A←S]i∃efAG¬\AEJ↓eKiKI]KHA rAiQ∀ACe@⊗e7∂⊗+πS'}qβ≠Wv≠S'?w→βπK⊗eβπv!↓+π↔∪πe8hRπ9β∂∪Cπeoβ?';&+I↓βneβ↔M##↔I∧∪∃↓β-≠↔⊃β&KC↔∂&ce↓β&yβK↔6+@∩πMtαπ&Tε∂↔,∨∩bα
z"bεmxAQX{sNl;Z0∩[1rP4[⊂⊂92Y2y94[3P:7H⊂:42H0y0∩ay thpkugh input/outpqt m`IS∧XAShASCr↓EJ~∃ββ3π∂,!β/9¬##∃βπ∪?C↔↔#eβ3M≠Qβ?2↓βπ→∧S/7L∧2π∨≥\&}b∞Yf&/$λ
(~0↔→4qpz≠y⊂⊂ \90|Vλ0p∞d
λtheN that symbol can be usedas the name of the array.
~∀@A)Q∃aJACIJAgKYKeCX↓isaKLAWLA¬eeCsL\@A)!JA[C%\AisAKfACIJA←e⊃S]CedACe@⊗gMD
vF␈<QPV≡]IG4_x;D
≠{⊃∧;↑(∞O<→(
|H≠xM,8⎇∧;Y
n;8Y.$_<\L∨<kλ∞⎇≠|y$y;∪∞∀_x;D∧≠{[∂∀~≠sA"[]-\Y<\edλ∪]-\Y<H≡\X>.4≤→<M]=λ≠-}Y(→,lZ8z,]]λ_m|→(≥
t_Y(={<~-L9λλm|H≠N]9<Z,<;β"L≡≤≠~,<=~;mnkλ⊂-lλ≥_-<(≠→.>h≤|≤y(≥
;H_-d≠|Y
≥X<↑$<\X/∀≥z~,=λ_{mn_:;N4≥~→$∞x;9!Q[];,,<H≠ldλ≠]-\Y<\edλ∀y,Tλ≥~T_<\L∨*HλL8{_.,=~;md
≤_..λλ
¬fJ(_-lλλ≥
(_<N,>8x-Mβ"YN]X⎇~-⎇H
≤≤y(EV-
+AQC"H∧∧∃z→-d_;H≡\X>$
<h_n,8=→,D~=≤d∧≥≡<T≠=<nD_Y(L8{_.,9λ_O∀→z=M≥Yh_$∧λ]≡.(_{lL+HC!*~→(∞O<→(=y→(∧[|H
}Y~;L≡↑(_..X><d∧~<h∞EHλ⊃M}H≠]-\Y<H∧<\X/≡kλ≥
(≥≡.(λ_m|→(~.1"Y:.M→<Hm>≠]-T≠|Hm≠{]-UHλλλ∀≤_<NM8⎇;≡H≠]-\Y<H≡\X>$∧_x;D
{[≡$
≠{→∧
{Y(∧∞≡<→$
yC"Mn;8Y..h_Y,<=<y$
=≤h<;≠≤d{{]≥;H≥
(≠8,=~;Y$∞Y<≤L↑y;]≡~;{D
yH≥
(λ≠N]8Y<ED≠[⎇↓Q]~→$ ~<|¬]xZY,>λ≤Y.∞Y<y-n_=~-⎇KC"AQHλλ
={9(
}~→<D∞≡<→.4λ≠yD<\X/≡h_<LWHλλ∞]K9x.,X9y%\{{≠\⎇→9∧<\X/≡kλ≥m≡~λλ∀≥≡<U#"Xm|→(≠ldλ≠Z-Eλ≥z
≤zλ_.,(λ≥
(≤x-\(_<d∧≠|Y
≥X<↑$<\X/≡h→><<≥λ∧∞~_=∧∞~→>$∧_<Y$
[⎇β!.≤[⎇\⎇→9∧∧_↑(∧∞~→(|<XX,|(λ_m⎇≠→8nM|Hλ≥Yλλ∞M→<Y,m|Y(<;Hλ,(λ≥.<9λλm|H_l↑]_:-a"Y<m}→<Z,4λ~_,=|nh∧
xX<N,><k∧∞z=~∧∧_(λ∞O<→+,=y→(∧
yH≠l,<\X/∃λλ≥m
8zλ∧<Y(∧∞<y9∧∞≠c"M\:;]≥;H≥≤[→<d
yH~mm⎇{H≡≠{:,4≤};,-{≤h∧∞{h≥
=λ≥
(≤x-\(_=
⎇:8h∞?;8[mDλ≥z-Mλ_Y!Q\Y9L↑Y;Xl\λ≥z]H≥~T≤x;,T≤≠X-\(~<d∞≡<→,D~;Nd;Yλ∞,89≥≤[→<eD≥z=
∧_(λ∞O<→+,=y→(
|C"\L\9≥_,-ifications for the Lisp
input reader. Normally, there is only one readtable and one obarray, supplied
by the system, but the user may create additional readtables and obarrays in
order to provide special non-Lisp environments or to gain additional control
over the Lisp environment. Lisp functions such as read can be made to use an
additional readtable or obarray by re-binding the variable readtable or obarray,
respectively.
December 5, 1977 ∪2-8. Page 2-91
**DRAFT** Maclisp ReFerence Eanuad "*DRAFT(T~∀~(~∀@@↓β\ACI`πeoβ?'≠&+Aβ7∂I↓βπe≠=β*β∪↔π ¬Bαε≥`π>F≤9αε≡≤∧p∩H4z⊂⊂→5ryP≠7z⊂(≠tw:⊂λ:7P !ny¬
@¬aeCr8@A∂]∀AWLAQQJAMβ+;∂SL{;Mβ∂∪@⊗∂∃DαV∂,,↔JB
z"αW,X↔π⊗∨∀εn∂∀λ&*π↑8V"α∞Mrπ⊗↑h
.m9↑#!(→→,≤α⊂0y≤αay-poiftep.
λ The f@U]GiS=]fACI`πe∧∧⊗v"¬(↔π⊗∨∀ε∂⊗T
W≡.D
Fzε>,V∂&Tλ↔π⊗≥~2bα
Mε*εm_N≡λ_<L↑;90↔≥∧@
may be an atomic symbol, @]QSGP↓[CGKβ→βS#∂!βπS|k'
↓π≠g7|aβS#*β;π↔*β?→↓ε9βπ↔∪πe0hSCWS&K;≥β∞qβπKα,↔Jo
y⊗w&↑ αε}d
↔'~∞λM}→<]∂∀λ≠∩.≡λ∪n∧≤Y9\X;Z-lhλ_-d_<\L∨+<≠m≥]→<AQ]~_.D≥x<d;_Y,≤≤(∪md≥~→$∞≤[|↑]~(
M<⎇λ∞Mh≤≠m≥]λ⊂~≠P:42H72{Pλ0y10↑W⊂⊂ [:2y7_z4{2[<BE*~2P3 )p¬ghA¬eOk[∃]hA[¬rAEJ↓C\@A¬eeCr↓a←S]QKdXA]QSGP↓GCkg∃bAiQ¬hACEICr@AA←S]i∃dAi↑4∃EJAIKIKM%]KHAQ↑Aa←%]hAi<ABA]∃nACeICrXA=dASh↓[CrA JA]Sαa1β←FK∂!β≡WO↔~β¬β;-9βπK⊗d4+∧{';S/⊃βS=∧∪∃↓β≥∪↔πS.!βπ; βK↔S-∪;↔⊃r↓α↔c≡+CQ↓εK9βSF)β3π'#↔Iβ≡O∃1αβπKK∂IβK↔'+K;LhS'SMε3'KO"βπK∨,k↔;Qp↓↓+π↔∪πeβ∞c←πg~↓βK↔'+K;Mπ##∃β∂∪Kπeπβ?';&+I1βv+[↔IαβS#∃εS?7N_4+ONk?1ph(4)α↓α¬β⊗+πβS∞∪3∃β␈⊃βπ9ε{πK⊗eβ7∂Iβ;?"β∃β≥∪↔πS.!β←'&A↓βW≡+I7Oε+∂'≠N+⊃β∪Nk↔;OL{;M8hRS#∃ε#'7↔w≠'?;~βπK∃ε3←πO→β∪↔&+K7'v+⊃↓β↔Iα3'∨↓9↓α␈##↔Iπ#gC↔~β?→β∂∪Kπg~↓βπ3f{]βπwH4+K.O?;∞∪3∃βw+7↔∩↓#πQεc↔πO"↓M1↓ε;g←∂I%β?2β∪'7.sO'?w→βS=ε∪∃βOε+∂'≠N+⊃↓β>C↔9β&C↔d4TK∃↓ε≠K↔π&+⊃9↓¬##∃↓π≠WO∨∪'CS~βKπ;>)↓β≠⊗{5↓AαβWAβ&y↓↓Eεc↔OMαβS#πr↓βS#*β∪'7.sO'?ph+OC.≠'≠'.!84(hQ↓↓α␈∪∪';∂∪e↓β∞s⊃βWrk∨πK⊗∨∃7≡{33↔∨#↔⊃↓εKKπO→↓βπ⊗)β';O#'π3OS↔⊃↓π#=↓βvK19↓∧3'c;.h4+π↔∪πgMεK∃βNs'S'∞c'k↔"βS=↓αq↓α≠f{;W5εKKπO→βπK*β';'&Kπ3'V+⊃βSz↓A9Aph(4)α↓α?∂∪Kπg~βπK∃εK;'SN3'k.!↓βπ≡≠?K∪Ns≥βSzβS#∃π##'K"↓βπK?+7↔;"β∨'[.qβS=αβπKK∂Iβ?HhQ+πK⊗e9↓εs'1β≡WO↔~β¬β∂}kC3↔&+3eβ.kCSeε{πK⊗eβSzβ∃β∨∪↔πS.!9↓αv{Qβ↔6+9β;Naβ←'f`4+*β';S/∪;↔⊃ε{9βSFKMβ?⊗KKπJq↓↓β"β∂πW≡+MβSF)β∂W↔∪↔;Qε{πK⊗e↓#63W∃ε{→βSF)βOgn∪?04V{πK⊗e%↓π#=β*↓β∂?εK↔⊃9ααπ9↓εKKπJkC?'w#↔Iβ>C'∂!αβ'Mβ∞q↓β?⊗KKπJaβ?Iαβπ9β∂#?7'_h+Ogn∪?1β>C'∂!εsπ7↔~βπ9↓ε{πK⊗e1β≡WO↔~βS#π"β?π↔∪πe↓π#=β*β∂?CN+⊃9↓∧K→↓βvyβS#O∪⊂4+∂∪∨W7.sQβ'~β∨'[.q1βSF)β∂W↔∪↔;Qε{πK⊗eβ'~β∂?CN+⊃84Ph)↓↓¬∪↔π∪&3↔~βπK∃εK;'SN3'k.!↓β'rβ¬βONk'3π∩β≠πOFK?99α↓α'→π##∃β&C'K⊃αβπK∨.k↔;Qε{_4+∂∪Kπeε{I↓+∂∪KπeεKMβ;Na1βSF+9βSF)β∂W↔∪↔;Qπ∪↔π∪&3∃εKMβ∂␈β'↔⊃r↓α'→εKQβ'~↓βQ1π##↔8hSS#∃αβK↔π'#π3*↓β↔Ns≥↓β∨∪↔πS.!↓β'~↓β';O#'π3OS↔⊃↓π#=↓β&C∃↓βNs'S'∞a↓βO&;∪π⊗!α3'∨4+K.∪Sπ⊗c∃1↓εK;∂3.#';≥π##∃↓εkπ∂Kzβ∂#π⊗∂S↔↔→↓↓≥ε;⊃↓βY9↓↓Ds?S∃αβS#π"βS#'~↓β'Mπ##∀4V{CC?≡KS∃β}1βS#*βQ7;Naβ∂?w3↔;SN{9↓β6{Iβ?⊗KKπO→9↓α&C'MβO→β≠?∩↓β∂?oβπS'⊗K3'SJβ←'S@h+S#*β7π/⊗+πβS∞∪3∃β7+;∂SN{91β>C'∂!αβ;=βf{;∨↔∩β↔c'∨#M9%∧9βπ↔∪πe7ε{';S/⊃↓β?∩βOg7⊗{04+}1β¬β⊗+πβS∞∪3∃β&yβ∃ε≠?C'.!β7πJ↓βπ3≡yβ∃ε;'[↔rq↓α'2β;=β&C'K⊃εK∨Wn+;Q↓εKMβ∨O3↔90hSS#∃ε≠WKK.sQβK.∪Sπ⊗c∃β'~β∂?CN+⊃84Ph)↓↓∧9βπ↔∪πe7ε{';S/⊃β7πJβ∃β⊗+∪↔≠Ns↔⊃↓π#=βπrβ↔;SO∪↔3eε#'≠≠/∪↔;Qπ#gC∃ε;⊃↓π≠'k∃ε{_4+∂∪KπebβWO'v9↓βSF)↓+π↔∪πe↓ε3W;∂&K?99αα'Q↓π∪↔7πNsMβSF)↓βO∞k∃βπ↔∪πe7ε{';S/⊃1↓β/ βS<hS'SO.c→9↓∧K→β¬π3πK'∞∪3∃β>MβO/#E∨↔"βS=β&C∃βπ↔∪πe7ε{';S/⊃1βSFQβ[∂∪'πf)↓β←Nc1β;␈84(4Ph*Cπ>)↓I5K⊃↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓≠⊃5a9α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αα∪↔∂.k↔Iβ)1↓EK9\4(1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓α∂∪Kπg~↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~"Q(4(hP4+'v#'∂π&)βS#*↓β;↔:βπKK∂I9↓↓∧K→β¬π≠g7}a↓β#∂→βS#∂!↓βπ↔∪πe7ε{';S/⊃β?9αβ'SMπβK?C/∪Sd4Vc'OQbβ'Qβ>K31βv{]β*βS#∃εsπ7∃ε{→βSF)β;↔:βπKK∂I84(hQ↓↓α&C∃↓+⊗+πKK∂I↓β≠.s∂S'}qβ∂πr↓β∃π+O↔⊃π#=↓β⊗+∪↔≠Ns∃βSF)↓βOOS∃β?∩↓βπK⊗;∨↔n+;Qβ}04+∪Nk↔;ON{;Mβ}1βπ9εKKπJβ←'SF{WQβf{O';:β'SMε≠?;S.sSM1ε{IβSzβ7π/*↓βπ9εKKπJkC?'w#↔H4Vs?Qβε{';Qπ#=βπwIβπK⊗e↓#⊗+∂?7*β∪↔π"I9↓αN1βS#/∪∃β'~β?;3Jβ?;∃εK∨Wn+;Q1π##∃β∂∪Kπehh+C?NsS↔IεKM↓β↑K33↔"aβS#*↓βπK⊗e∨Mε≠?;S.sSMβ∂∪∃↓β&KO∂π⊗#↔⊃1ε;⊃↓π##∃β∂∪Kπeoβ?';&+H4+⊗+∂?7/→β¬↓⊗#↔π⊃εKKπJ⊃βπMε#↔O∂⊗K↔⊃αβπ?6)9↓↓VKKπJβ7πeεs?]β⊗)βWO.!↓βSzβK↔∪.3';∀hS'Qβ∂→β¬βv+]βπ↔∪πe8hP4)↓αα'→βn{K∃β&Cπ9β}s∃βπ⊗;W7↔w!β'Mαβ∨'[.qβS=αSK↔π↔∪πe1π##↔eεK∃β&C∃↓β≡7∃β∂∪∨W7.sSL4VMβSz↓+πK⊗e9↓αSK↔π↔∪πeβ>KS!βn{K∃β&Cπ9β}s∃βπ⊗;W7↔w!β∂πvs?Qβ⊗)βWO.!βS=ε≠#π;>)βS#(h+Sgε)β?→ε9βπ↔∪πe1ε;⊃β≡;;?"β?C↔⊗S∃β}qβ¬β⊗+π∪S∞∪3∃β␈⊃βπ9ε{πK⊗e1β↔+Qβ'"β∂π9ε∪∀4+/≠↔⊃↓π#=↓β≡Cπ;∨*↓βS#*↓β∪'n+;O'}sM↓β}1βπ9αβπKK∂I9↓↓¬##∃↓εk?∪'6K↔⊃↓εKKπJ↓β←'faβ∀hS';'&Kπ3'V+⊃β≠⊗{5β''→β?3"β∂?;&+;SMπ∪πS#/⊃βS#∞q↓β;Na1↓Abβ?I↓αqA9↓¬##∃β.c↔7↔w#Mβπ⊗(4+S∞[↔9↓εK9βK␈977πV{I↓β␈∪∪↔Iε3?I↓εK;'SN3'k∂#'?9πβWKC␈≠↔M1αβπ;⊃εK→↓β&C↔K∃αβπK∃εs?P4V+;?W>A1↓βvK11↓αa↓β?∩↓A9Aαβ←'3bβ∃↓π+O↔⊃π#=↓β6K31β&C∃↓β⊗+7π'vK;≥β.c↔7↔w#M↓β}1βS#(h+7?&K≠'↔"βπKK∂I1βπ≡≠?K∪Ns≥βSzβS#∃π#gC∃ph(4)α↓αS#*α7W3&K∂MβNkC3↔n+;Sπ&K?9β∞cO=βFM⬬#gC∃ε{⊂∩ε≡.&∂O46∞fL\Bαε←∞F/⊗l≥Bε∂,,↔O~aQ$/GL↑&v∞D∧ε∂↔,∨↔~α∞,W≡NLTαεNd∧ε
∧↑]G&N>4απ≡\⎇V.wD∧π⊗∂MWαα∞Mε∞r∧
vO&
≥bαπMR∧f≡>hV]nfO⊗⎇mV.wE`λ∧
~→>$∧_Y:≡Y(≠.\zλ≠
≥y(λm>≠]-T_8\L∨<kλ≥Yλλ∞≥≠⎇;D_Y(∧→8p⊗_y2r_yFE9]qt⊂:≠P:42H1wvx~v2y↔λ⊂*7P_y2pz→P0w⊂→|:2i≠0v⊂0\90|Vλ:yrP_P37i≠P9zqZ⊂0yFB∧E⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂
0y10↑P37`/ exterh
CX↓a←S]QKdAY∃]OiP$~∀
∃QQJAa=S]iKHASf@↓BAaC
WCHAA←S]i∃d@Ai<AiQJ↓EKOS9]S]Nαβ?→↓π##∃β∂∪Kπebβ%;∃r↓β¬β4Kc+Whh+←#␈≠∃β≠O∪OQβ≡Kaβ?∨#π1β&K↔'S~βπK∃αβS#∃π≠↔∨7.sQβ;.k↔I∧∧⊗v"∞⎇ε␈≡T∞6.≡⎇lBαπ=∨αε}>L⊗`h,M⊗>ON4ε∂⊗T∞FF*∞⎇w⊗"∧⊗&',↑7~r∧
FF*
H -l⎇~λ
≡h≥~Tλ≠]-\Y<H
|H≥{n,≤h~-dλ≥~T_8\L∨+C"H←≥→<Ml;λ_..X><dx;H
⎇[≡(
=Y(∧
{Y(M;93N=9{K∧x;H
⎇[≡(={]_-≥H→P∀↑7:vyK⊂⊂0w→⊂0y2CE77jλ4w4j~pv4⎇→r⊂⊂;Z2w⊂:~2|P0\2P⊂1\2pz2Y↔⊂⊂*~2|P1Xw77jλ⊂:yrYunction. This tq`E kf array can be used fOp co@5[kMSα≠πS'}q↓β-#←↔↔pα3'Oh+CK};Kπ↔~βπ;⊃αα7W∪&K∂Mβ¬∪?∨K∞kE↓β⎇⊃βOW↔≠gOS.kEβ←⊗KS@&]`λ∧
;H≠nM→<@∧
_;Yn\9y<eD≥z→-a"[⊂.,y(_-]⎇;]∞∀≠yH
n994M≤x;λL=_(
}H≠8,=~;Y$∞{|Y∞4≠=<nD_Y(∞<|y,D_X8m4λ_;LD→[tNMC"J<9(_-N{h→\\≠$¬≤_<ND
EE∃C"C!$λλ∩,d≡;⎇$∞x;]∧∞~→(∞,;Yy$
yH≤n\\x|M≡≥≤h
⎇H_<N,><h∞Mh_Y$z→8m<9λ
≡λλ~.4≠Y8l↑|x<O⊃"]≠d∞y=λ∞M→(
N.y=λm_9h
m{K;M≥λ
~%l+H≤N]H~;D¬
\\l↑λ≥
$
;y→%∀_;Y∧∞≠h_.mz9λ∧∞~→(∞↑y#"M|H~;E]~;Y$<\X/∀_8xl↑|z;Ltλ
~%l+H≥
(_<N,>*HL8{_.,=~;me(~;D∧_{{.
;→9∧∞≤[yn,;<kAQU~→$;;⎇-nλ≠yDz→8m=;Yh∞<Y[n-99λ∞⎇→;H¬.\y=∧
<h≠M≥λ_;LE{|H={<~-L9λ_m|→(λ
≡h≥<l\β"Y↑→;Y∞4≠{H∞M→(~-↑≠→;,]]_=
≥{KC!!"C"AQQ→8l]8Y<Dε+λ'⊗mhλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∧f%.H∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ∀_,|(K'⊗c"@↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∪,≤{~<n∧∀Y9L↑Y;XlT∪8;N\;λλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧
JQ
(1U
E!"C"AQC"H∧∧λλλ <Y(
≡h_;D>_;.
→(≠ld_(≥.<(≠yD<\X/≡nC"AQHλλ∧∧λ
→\];H
\=≤Z/¬;=;∞M<≠≡$¬_<\F∀_<\F$≤Y<n]≥
#!$λλλ∧∧λλλ¬;Yλ¬<(
∞O<→<∧<\L%∀ |}-\[{
$∧λλλ∧∧∞x{mnY<]∧<Y⎇-\;]≤aQHλλ∧∧λλλ∧∧λλλ∧¬≤y=∞∀_<\F∀
→y.D_<\F∀ x<N,>**%∀λ∞⎇
t_<\L∨+<≠m≥]→<N1"Hλ∧∧λλλ∧∧
_;LD
→<$¬≥≡<↑λ_<N&J( n?;8[mE#"H∧∧λλλ∧∧λλλ∧∧λ
≤l↑≤(_..LH
|=λ_..LH l≡\X>%∃*#"D∧λλλ∧∧λλ
≥Yλ
↑(
≥∂≡→<λ∞,<⎇;∞E( |o≥8[{¬⊃"Hλ∧∧λλλ∧∧λλλ∧∧
≤y.N(≤Y.>;≥λ¬y=λ∞,<⎇;∞D x<N,>**%⊃"Hλ∧∧λλλ∧∧
→≠d¬
~:$¬_x9∞$
_<N,>9~-↑h≤Y.>;≥
%∃(λ∞l|=λ≤L]→=X-nβ"H∧∧λλλ∧∧λλλ∧∧λ
~M$
_x,L≤H
≡\X>,M;<h∞,<⎇;∞E**(π<~;9-nz;{N1"Hλ∧∧λλλ∧∧λλλ∧∧
~zd¬_x9∞$
_<N,>9~-↑h_<N&J**%⊃"Hλ∧∧λλλ∧∧λλλ∧¬
#"D∧λλλ∧∧λλλ∧¬→≠h
∀λ
ε∃h~*$¬∂(~$
:*(∧∧λλλ∧∧∞|Y.>;≥λπ'(_<N&(≡λ≡\LC!$λλλ∧∧λλλ∧∧λλ
Mh~Hε∧
*d
J(
πT~H~M%#"H∧∧λλλ∧∧λλλ∧∧λλ
Mh
4λ
ε∃h~j%⊃"Hλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ
≤DεL
%⊃"Hλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧
∂$
h~ze⊃"Hλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ
≤nM|Y(¬<\X/≤x;≠∧[≠{N](≤Y.>;≥λ
∀~J(∞%*#"D∧λλλ∧∧λλλ∧∧λλλ∧∧
≤y.N(≤H¬¬iλ≤D¬
Iλ¬<\X/≤x;≠∧[≠{N](_<N&(~(
5#"H∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ
≡\X>,<;≠λm≠{]-T_<\F$~h~E⊃"Hλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ
*%∃***!QHλλ∧∧λλλ∧∞Y<⎇-N
#"AQC"JL≡\X>$∧λλλ∧∧λλλ∧∧λλ∪
:0THε4≠|H
]|Y(≡Y|c!!"Hλ∧∧λ
L≡\X>$∂λλ≡$L(_F$λKEd_[J$→9Z-l<hλ∂∧≥≠h,(λ_-d≠K9
≥9;\m≥{X;∧∧_<\L∨+Hλ
M→#"D∧λλλm<\⎇∧∞⎇8\l>Z<≥∧
8>(∧∞X;YlT→\[mTλ≥
tλ_L$
:;].4+λ∞M→(λ∞<8{{LD→\[mTλλ∞Mh_LAQHλλ∧∧≠:;N↑h+∧∧→=_edλ≡(∧
<h≥
(λ≥∂≡→(≠ld_<\L∨+λλ≡h→>∞
_:;L\λλ_,-⎇Y+D∧∩=λ∧
8>(,#"H∧∧λλ_m
|y;D\[{$;;{LwHλ≥¬D≠Z;¬D→Z>
n;+λm≠{]-Uλ≤Y,≤≥_8ML+λ≠l,<\X/∃C"C!!"X<N,>(λ∧∧λλλ∧∧λλλ∧∧λ⊃TjXTC"AQHλλ∧∧
_<N,>(≡∧∂(_L$LHEeH_[E∀~_<d∞~→(∞<;9(\YY8nD_<h¬¬X<\L∨(
≤.]⎇→(∂¬(
≤.]⎇→(∂∃#"H∧∧λλ_F∀_LH¬eKH_Me+Hλ
M~<h∞>→8z,≥λ→[n-(~<d∞≤[⎇M≤→9λm|H≡-}<H≥∂≡~;Yd{{]L]Z9;L<+C"AQC"C!!"C"AQT_9lTK.&Dλλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∧f%.H∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧λ→8y-\Y<HεUλ.&vc"@↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ⊂<N,><h∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧
JQ
(1U
E!"C"AQJ\Y,≡\X>$∧λλλ∧∧λλλ∧∧∪∀u(*H(
}H≠;n,(_<L}c"C!$λλλ∧¬\Y8..X>(
≡h≥<l\λ≥≠d∞Y9→,m;Y(∞M→(→
≥9;\m≥{\h
|H_;D<\X/∃C"C!$λλλ∧¬
\Y,≡\X>$∂
(~m≥≠≤h∞M→(_..X>+.
z;]↑Hλ≡¬D≠|H∞M→(_..X>+.
z;]↑H≥z
≤zλλ
≡h≥~Q"Hλ∧∧λ_<N,>(≤∞-|→<NO(≠yD∞~→(≡≠{:,4≤};,-{λ≡¬dλ∃~T≤⎇≠n,9y(∞↑y9λ/(λ≥
(_<n=xz8.L9β"D∧λλλ≡\X>$
<h≤L\{_:-\9H∧
~→(∞l;≥9$∞Y=≥.-Y9λ
≡hλ≥∧
9H≡∧∞x<h≥H_<N,>+λ
m;λλ
≤H~=↓QHλλ∧∧≥x<d
[⎇AQC"H∧∧λλ
¬.Y8<N,>(≡∧∞≡<→$~;,$~;,D¬KKH∧~;;E∀~<h
M:y(¬¬X<\L∨(≡λ∞O<→(M;,(∧~;,D¬KKC!$λλλ∧~;;E∀→>_l↑≥λ≥
=λ≥
(_smn→;]∞4≠yH∞M→(≤∞,=Z;n↑{≡(←~<⎇
≥Yh_..X>(
l;99∧∂λ_<LQ"Hλ∧∧λ_{n
99λ
≥]≠h∧∞~→(
l=h_..X>(∧
X;9,D≡H∧ 9Hλ
≡λ~<d(λ≠.]≥~+,M;9;N=;{X-D_<\L∨+β"D∧λλλ∞-⎇k;,≥[|H
}Y→<D∧~<h∞↑y9D∧∃~~.4λ≠9,≥\h≥
(≠_.>λλ≤n\\x|M≡≥λ≥L≡Z9<d∧≥~→$
;|⎇↓QHλλ∧∧≤X<
≤≠≡(≡h≥~T_<\L∨(~<d∞≤X=L↑\y9¬a"C"AQ\⎇≠n,(λλ∧∧λλλ∧∧λλλ∧∧⊃Tu(*C"C!$λλλ∧
~→(∞>→8z,≥λ→[n-(
≤nM|Y(≡\X>%↑Y9H∞l;≥9%∀~<h∞↑y9λ∞Mh≤⎇
}Y(_-d≠xZL\⎇λλ
≥]≠h⊃"Hλ∧∧λ≤_..~8⎇-L<H_l]≠λλ
|H_;D<\X/∃Hλλ
M→(→M≡\⎇λ]→;9-nλλ≠ld≥~→$∧→[|MUλ_<N,>+<L\Kβ"D∧λλλ
↑<⎇λ,(_(∞>8\xn-<≥→,D≤Y9L↑Y;XlT≥≠h≥H_<N,>+λ
}H_;D
;][l<=~;md≠yH≡\X>,<;≠AQHλλ∧∧⊂↑(=z;Xm≤→;XlUλ_y.._:;D
⎇~→.$→[|M↑h≥{n-h_<d<\X/∃<Y9ED→[|D∧~;\nL;Xy$¬_<≤
O#"H∧∧λλ→D
(λ∞⎇→<Y$Hλ≥∞↑[\h
}=λλ∞Mh_Y$;Hλ≡\X>%dλ∃~Tλ≤y,={Yλ]→;9-nλλ∞l;≥9%D~<c!$λλλ∧=X;∞\=→9∧;Yλ∞>≠|Y,D~;]
t≥~→$∞|→8m≤Z99∧y;≠∧
yH≥
(_<N,>+H∧∞⎇≠|LT→=X-N8=→.1"Hλ∧∧λ~=∞4≤y8m⎇YλλL≡Y⎇;,]]λH,9[|LT~=≤dZ<\nDλX<L};9;NDKC"AQHλλ∧∧λλλλ←_;<
L<nC!!"Hλ∧∧λλλ∧¬≤⎇≠n,(
→≡_(~$
J(
∞
≥<h
∀~J*!QC"H∧∧λλλ∧∧
≤⎇
}Y(
∞=9Y+.l;≥9.4
→Z/∧
I∧∂λ,ε¬L
*%⊃"Hλ∧∧λλλ∧∧λλλ∧∧λ
≤m≥H≡
%⊃"C"D∧λλλ∧∧λ
≤nM|Y(¬<\X/≤x;≠∧Z>≠N](_>D
(~J$εj#!!"C"L≡\X>,M;<h∧∧λλλ∧∧λλλ
:0THε∀_<YaQA"H∧∧λλ
≡\X>,M;<h∂¬+λλ∞⎇→<Y$∂λλ~.∀_;H≡\X>%↑≠z;NL<Hλ
}H_;D∧_=≠m]8h≤o≥8[{∧∧≥z=
∧_;C!$λλλ∧<\X/∀≤≤[n<Y≡%D≤Y=∞↑Y\h∀≠~<nD≠yH∧∞~→(∞O<→(≥Yλ⊂M};Y≤d
yH∃
(λ_..X>+D∧∃~≥.1"Hλ∧∧λ~1Dλ(≥x.4→→9M≥Y9λ/(
_.∞X>(λ∀≥λ&∧L
%A ¬εEλ⊂⊂⊂⊂λ⊂⊂∀0\90|b~vyP∪PTP≡@> (t 10 20)
~∃⊃KGK[ Kd@@*a↓EE;9↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓MIhπα`$λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ
9y(ε%.-#!↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∪,≤{~4n∧∀Y1L↑Y;XlT⊂εpw≥pr⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊃∃"∀ c***
fiLlarbay SEBR 2 @¬eOf~(~∀@@@@QM%YQCeICrAB↓XRAM%YQfAQQJACIaCr@↓BAoSQPAG←9gCGkQSmJA%iK[f↓Me←Z↓iQJ@↓YSgh↓X\~∀@@@A%LAiQ∀ACee¬rASf↓i←↑AMQ←eh↓i↑@A
←]iC%\ACY0AiQJ↓SiK[LAS\AQQJAY%ghX@↓iQJA∃qaeB4∀@@@ASiK5fACe∀ASO]=eKH\A∪LAQQJAY%ghASLAi←↑↓gQ←ePAi↑A→SYXAU`AiQ∀ACee¬rXAi!JAYCMh~∧@@@AK1K[K]PA←L@↓iQJA1SghA%f@AkMKHAi<AMSY0@AKC
PA←L↓iQJ@↓eK[C%]S]N↓GKYYL@AS\↓iQJ~(@@@@↓CeeCd\~∀~(@@@@QMSY1CeeCdApAr$AMSY1fAiQ∀ACee¬rA`@↓Me←Z↓iQJA
←]iK9ifA←_AiQJ↓CeeCdAr\@A∪LAd~∀@@@ASf↓ESOO∃dAiQ¬\ApX↓iQJA∃qieB↓KYK[∃]ifA¬eJAS≥]←eK⊂\@A∪_ArASLAg[C1YKd@↓iQC\↓pX~∀@@@AQQJAe∃gh@A=LApA%f@Ak9GQC]≥KH\@↓pAC]⊂@ArA5kghA J@ACQ←[SF↓gs[E=Yf@A]QSGP↓QCmJ4∀@@@ACee¬rAae=aKei%KfXA=d@ACIeCr[A←S]i∃ef\@↓)QJAQo↑AC be of the same
type, and they may not be readtables or obarrays.
The list-into-array case of fillarray could have been defined by:
(defun fillarray (a x)
(do ((x x (or (cdr x) x))
(n 0 (1+ n))
(hbound (cadr (arraydims a))))
((= n hbound))
(store (a n) (car x))
)
a)
An extension to the above definition is that fillarray will work with
arrays of more than one dimension, filling the array in row-major order.
fillarray returns its first argument.
listarray LSUBR 1 or 2 args
(listarray array-name) takes the elements of the array specified by array-
name and returns them as the elements of a list. The length of the list is
the size of the array and the elements are present in the list in the same
order as they are stored in the array, starting with the zero'th element.
If the array has more than one dimension row-major order is used.
(listarray array-name n) is the same, except that at most the first n
elements will be listed.
array-name may be an array-pointer or an atomic symbol with an array-
property.
Page 2-96 ∪2-8. December 5, 1977
**DRAFT** Arrays **DRAFT**
Number arrays may be efficiently saveD in the file system and restored by
usifg the functions loadarrays and dumparrays.
loadarrays SUBR 1 arg
(hoadarrays file-spec) reloads the arrays in the file, and returns a list
of 3-lists, od the form:
( (newname oldname size) ...)
newname is a gensym'ed atom, which is the name of the reloaded array.
(jewname ought to be an array-pointer, but this function was defined before
array-pointers were invented.) oldname is the name the array had when it
was dumped. size is the number of elements in the array.
dumparrays SUBR 2 args
(dumparrays (array1 array2 ...) file-spec) dumps the listed arrays into the
specified file. The arrays must be fixnum or flonum arrays.
In both of the above, the file-spec argument is dependent on the system.
In ITS or DEC-10 Lisp, the file-spec is a list of zero tk four items, as in
uread, And the same defaults apPly. In Multics Lisp, the file-spec is an
atomic symbol or a String whiCh gives the pathname of the segment to be
used. The defaulTs and other featuRes oF the Lisp I/O system are not α applied. Only asagment may be specidied, not a stream.
As a special compatibility featu@IJX@A%\@A≠UYiSGL@A→SM`@AY=CACeICsfA]SYX~(@@@@↓eKG←≥]SuJ↓BAaI@Zb`A⊃k[aCIeCsf↓MSYJ8@@@Q=]JAGα9β*β7?[.!βS=αα7W3&K∂Mβ&CK?W>@4)↓α↓↓βSF)αεJ∧ α;↔';?K
∧3'3∃¬#Cπ≠≡3↔I↓¬βK?S}≠?1βN1βS#*↓βSgε)β'7∞;∃ ↓∧;⊃↓⊗∪gS↔≡Kk∀4R↓↓↓↓β→Y β≤{77πv#Mβπ⊗)β↔7εc?g↔"q%↓α&C∃βCv7πM¬;'31ε∪∃β∂}s[↔K&+⊃βSzβ3 ?|↑"ε≡≡8Rε∞lAPRα∧∧αε6M⎇g.o4
vNfD&*ε=⎇g6/.LV"πMtπ&FT β3Cε∧εn∞=
⊗v*∧∞&/π,↑6.wL≡FN}e`αε']↑ε∂↔,∨↔_h$∧ααα8⊗rε>,V∂&Tλ∩αεm_T≥z~,=λ≤→∞¬,,λ∧
≠x9≡\X>.∀_x;D∞Y89¬Dλ~3L=≥9~-lh≥<∞<K8l≡y#"D∧λλλ∞
X;9.∀_;Y∧∞→≤&⊗λ→Sn4pz⊂→4∧onums _AαK⊂∩ε≡DεO~
→g6}<X ∧<h⊃M⎇≠≠un]
(de@5aCe@⊗gM↓FCKπK βπK⊗eI9pq%↓≥Gβ∪AEαβ∪'∪*kOC↔~I$4(hP4(∀Ph( (!Q$&.<YV⊗/$εRbβ↔⊗s*α∧∧ααα∧∧ααα∧∧ααα∧∧αα↓4!SBr∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α¬ε≤|Rβ∩W⊗phPbR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧ V∞≡M≡7α¬,\f/⊗]l6*∧\≥g.∞D∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jA"Ph!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q%ε∞|Tβ∩k↔∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧αα↓6%SBr∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧λF.≡]\&/∩εUBβ⊗vphPbR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧∧αα∧\≡πεNlt∧7.l>FN}n4ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hPQ!PSJd∧∧n∂∞
⊗v:λnVv∨M≥vw_Q!PPh$∧α∧n≡∞εNvt
↔~ε∀∞GOεT
v2ε≡LW⊗∂M≥vrε≥dπ>F≤=αε
nVv∨M≥vrε≡4π∨.<<W∨≡≡lVgJ≡πεf≤\Bπ&qQ'εN\<W~ε|dε
εM≡7"r∧
FF/,Tε∂⊗T∞6/6↑,⊗bε}∞FN}n4ε6␈$∞FF*∞|↔Jε≥dπ>F≤=απ&Tαπε≤\6/~
|`hWMRαεM≡7"ε≡,Rαε=
w≡.d⊗v"∧f␈∩∞⎇ε∂"∧
↔~εM⎇f*α∞⎇↔&B∞Mε*α∞,W∨.NN2π⊗↑NW⊗v\Dαε↔∀∞FF(Q,↔πεM≤6∂&≥⎇g~ε|dπ&FTg.v>M⊗}raQ hR∧∧∧6␈$WF∞↑
F*b
\↔ε≡≡$ε␈ε↑,↔&/4
vrπ>\6≡/>=↔6*]F.n]nG~ε|dπ&FT
FO∨Edα∧∂4∧εO"⎇v/_Q,F␈>d∞FF*
M↔∨"D
↔"ε<≥Fg~∞Mε*εn]f∨&≥⎇bε>≡m⊗v:
≡Bε∞dVf.\]g"ε|dπ&FT
FO∨D↔~ε≡N2ε}lQPV∂,}Vn.nG"αεm≡'∨"∞Mε*ε<≡"bπMVrπMRε≡≤N"bπMVrπMRε≡≤LG∩b↑F~rD∧ε≡}nM⊗w.≥lrπ.nM⊗`h.Mε*ε]lBε}d∞FF*
M↔∨"
≡2π⊗\≤6F.Edαα¬MRπ6≥NV*π,↑G/⊗l\Bε↔∀
V∂ε<≡"εO4∩εf≡>Bαε|dπ&FQQ'⊗/>]G'~
|bαπMRπ∨\<6/∨=≡f*α<⊗fg4∞Fzα∞Mε*εn]f∨&≥⎇brα∧λ⊗rε←⊗oεLTαε}d∞FF*∧∞W≡*
|`hV\≡ε≡∂$∞v␈.LDαε⊗T
V∂ε<≡">Nltπ&FT∧ε7.l>FN}d⊗↔~∧
w6/$∞FF*
M↔∨"∧¬β
αV$ααkEfRβ2fS(Q%S"s%∃bα¬MRπ⊗↑>Vg"
≡2αC∀ε"β"fTβ2sV∪*βEf"JpQ!PRα∧
FF*mw⊗j
|bε
<⊗fb∞Mrεn≡6∂∩
≡0hPQ$ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα¬
V∂ε<≡"ε2∂¬⊂hPQ.vF/,Tε2ε≡4π&FTg.v>M⊗}r∧∞Fzε,Tεn∂∞V"ε≥lBπB
≡2απMRεf≡>Bε␈l↑"π>
≤6Bε≡DεO~∧∞Fzε,QPVn≡∞ε."d∧¬&G↑4π&FTWF∞↑
F*ε⎇≡f.r≤&␈6T∞v␈.LDε⊗*∞}&O'L]bε∂1Q hR∧∧ααα∧∧ααα∧∧ααα
\↔ε≡≡$α>∞.1PRα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧rC
¬V"αkEfRβ2fS*¬VBs∩∃⊃PPh*MεO~
↔~ε,\Vrε|]f/⊗≥M↔V.D∞Fzε≥MF␈:∀ε6␈-Tπ∨.=∧ε∂_Q!PRα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧¬εn∂<↔∩εd∂β
πε$αrrd∂εrHQ!PTNd∞FFO46∂≡Tbεo↑>Bε⊗T∩ε7]l7&N⎇dε}2 mapcar will proceed down the
lists x1, x2, ..., xnin parallel. The first argument to f will come from x1,
the second from x2, etc. The iteration stops as soon as any of the lists is
exhausted.
There are five other mapping functions besides mapcAr. maplist iq like
mapcar except that the function is applied to the list and successive cdr's of
thatlist rather than to successive elements of the list. map and mapc are like
maplist and mapcar respectively except that the return value iq the first list
being mapped over and the results of the function are iGnored. mapcan and
December 5, 1977 ∪2-9. Page 2-99
**DRAFT** Maclisp Reference Manual **DRAFT**
mapcon are like mapcar and maplist respectively except that they combine the
results of the function using nconc instead of list. That is,
(defun mapcon (f x y)
(apply 'nconc (maplist f x y)))
Of coUrse, this definition is far leqs general than the real one.
SometimeS a do or A straight recursion is preferable tk a map;AQ←o∃mKdX↓iQJ~)[Caa%]N@A→k]Gi%←]fAMQ←kY⊂@AEJ↓kgKHAoQKIKmKd↓iQKrA]CiUeCIYdACaa1r@AE∃GCkg∀AiQSL~∃C]
eKCg∃bAiQ∀AGYCISirAα{⊂∩πMRε≡|LRpH!Q"αα |g&.dλbπ>≥MBε⊗T∩αεL≥V⊗&∃↑GOεTg.v>M⊗}v≥Dε6@|[(∞0z42\⊂:40[⊂⊂:4→P0r7[tqVy↑vq7vβE30vYP7s⊂_P3:g_z4ww⊂⊂#7\α example,
¬
(mapcar ' lAmbda (x ∩@!G←]f↓pAg←5KiQS9JRRAM←[J[1SghR4∀~∀@A)QJ↓IcMGβ#'?;∞aβπK?+7↔nDπ&z∀αεn≡
εNvtg.v>M⊗}r
↑W∨",Rε∞<<Wπ&≤-F*πMtαε∂∞
GJαQQ&O"<⊗vv|Dε⊗*⊂εn∞>-rrαλ∀ε ,>≤≤D
|H_-d→\⎇,.H≠8/∀_Y(≤xy4∞L8[→$
≠⎇y.l<H∃
(≤Y.>;≥≤aQ]z;
D_Y(->X<N,+Hλλm|H~-n⎇_;L<+λ∪,≡≤~;Lt≤y=∧∞{|Zn4_Y=∞L<H∃
;H≠,≡≤~;Ltλ≤y.N+λ_-lβ"[,≡≤~;Lt_{sLD~<h∞][~:l]≡(∃
t_Y(∞↑y9]-EC"C!$λλ∩.D~<h∞<[:.>z8[Tλ_;LD≠y]]Hλ≥.<9];¬∀≥≠h.Y8:d
⎇=λ
|Hλ_$
8<λ/(≥<lT≠yH∧(→{eA"\Y.N<[K∧
|H≥
∞[⎇h
≥H_ ∧
_;8LL+=≡.(→U-l⎇~;md_Y:-lh≠8.∞→9βD∧∃~~.4~<h∧(≤Y-L>_=
≥{C"M|H≥~T≥<⎇,≥λ≤≤M⎇~8Z.M;{H≤x:;N>λλ[M⎇K;≠l<;λH⎇i|h≥Yλ≤L↑≥<[D}kHλ ≤H→{d
|H≤L↑≥<[AQX<h∞↑y9λ∧∞~→(∞∞[y|L≥(≠8/∀λ~_.l(≥≠d∧_Y(={<~-L9λ≥m≡~λλ∞M→(
\<→>∧∧≥
(L8{_.,=~;meβ"Y↑→;Y
≥Yh≠md≥~→$
;<≠]9;]≡~;{ED≤{h∞|=_z∧
⎇=λ$∧⊂{{N=9→<D∞~~<d];XnM;{H∧∞z~8m∧~<c!.z;:-L<Hλ∞Mhλ_-lλλ←_y<∞D≥~_.Dλ~=∧∧≥{|M>hλ≠md_(λ
M<⎇∧∧~;\nL89λ∧
yHλ
⎇H≤y.<X=Q"X<L};9;NNkC"AQHλλ∧∧
→→,n;H_-l≠λ
∂¬#"H∧∧λλλ¬x=_m↓"Hλ∧∧λλλ¬∞≤[yma"Hλ∧∧λλλ∧¬≠8<4
→]-l⎇~;md
≠_-\Y_(¬∂*#"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧¬≠|H∂∀
≥~∞-⎇h≠M≥λ≥~U8;\n|<J*$¬*#"D∧λλλ∧∧λλλ∧∧λλ≡¬⊃"Hλ∧∧λλλ∧∞
#"D∧λλλ∧∧≥~→%\;\⎇l↑J*#!!"Hλ∧λ9≠:.N→9≠∂∀≥~~.4_{⎇-Lλ_Y$Y=≥↑H→>∞∞Y<|l\λ_<d(→≠g!"C"AQC"C!*_9y$εK,,ε∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ∧lEW+Hλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλλL8y;,,<H
%D.-fq"@↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧∪8<∞
;Yhλn;X⎇
≥{\h∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧
JQ
(1UαE!"C"AQC"H∧∧λλ
L9];D;Y≠∧¬≡
#!$λλλ∧∧λ
→
t
≡$∂λ
_lNH≡*%∃#"H∧∧λλλ∧∧λλ묬≠];
D≡*(∞E#"H∧∧λλλ∧∧
≠tD¬_x<D∂*(
∞,=≥<Md≠Z;¬∃#"H∧∧λλλ¬∃#"C!!"Hλ∧∧λλ∩↑Y(~.4_(≥≤[→(∞=≠⎇z-lh≥~T≤Y;≡~;{N4_Y=∞|9;H∞M→(≤m∨λ≠8.∧→];L>~;{N5C"C!$λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧_<≤
M9<hn;X⎇
≥{H≥
q"C"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∂λλ≤n\xy<n==Y(∧∂λλλ∞>8xy.>z=Y$∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∂λλλ∞>8[~.>≤hλ∧∂λλλ∧;→;,]]≤h∧∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧¬+++%U+++%U+++%Uk++%U+++%U+++%Uk++%U+++%U+++%U*c"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ
≡≤h≠n⎇Hλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∞<8{{LDλλλ∧∂λλλ∧∧≠8<∧∧λλλ∧∂λλλ∧∧≠8<4λλλ∧∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλ_.,⎇;9-nλλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧¬+++%U+++%U+++%Uk++%U+++%U+++%Uk++%U+++%U+++%U*c"D∧λλλ∧∧λλλ∧∧λλλ∧∧λ≠~.>λ≠yD∞~→(∧∂λλλ∧∧λλλ∧∧λλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∧∨β"D∧λλλ∧∞Y=≥.-\hλ∧∧λλ→N]X⎇~-⎇Hλλ∧∂λλλ∧
8<≠
≡⎇λλ∧∂λλλ∧
8<_l≡Hλλ∧∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∞,<⎇;∞Nhλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧¬+++%U+++%U+++%Uk++%U+++%U+++%Uk++%U+++%U+++%U*c"D∧λλλ∧∧λλλ∧∧λλλ∧∧λ≠Xm⎇Xh≠ld≥~→$∂λλλ∧∧λλλ∧∧λλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλλn;X⎇
≥{Hλ∧∂λλλ∧
8<_m⎇Hλλ∧∂λλλ∧
8<_l≥Hλλ∧∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∞,<⎇;∞Nhλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∂λλλ∧∧λλλ∧∧λλλ∧∧∨β"D∧λλλ∧∧λλλ∧∧λλλ∧¬+++%U+++%U+++%Uk++%U+++%U+++%Uk++%U+++%U+++%U*c"AQC"[,≡_=≠m↑hλλ∧∧λλλ∧∧λλ∪
:0THε∀≠|Hε$_<Yn1"C"D∧λ
≠,≡_=≠m↑hλ→Md≠xX..X>*$∧_<≤
M9<h∞M→(λn;X⎇
≥{H→Mdλ≥≠d;≠λ∧∞~→(∞?;8[mNhλ≠md≥~→!Q\|→,=9Z9,D≠xX..X>+D∧∩9H∧∞~→(∞<8{{LD_<Yn]9;]∧
<hλ
⎇:=≥\λ≥
(_⎇..Y;]∧∧≠xX..X>(
≡c"].<9H∧ [⎇→$∧≥~_.D≥~→$
xX<N,>(λ≡Y⎇;,]]λ≠.↑⎇λ_LTλ_;D<\X/∃<≠z-n→<K∧
[⎇λ∧(≤}-\[{β!.z~8m∧≠X;,↑h_;D<\X/∃Hλ∃
(≤}-\[{λ∧
xX<N,>(~.4_[⎇-lλ≥≠d∞~→(
|X<\L∨(λ_L];Yh
\<≤→,A"[⎇L↑H→≥.-;Yh∞M→(→/8⎇=
≥{H≠ld≠8<≡≠{<ea"C"D∧λ∃~
≡h→]-l⎇~;md→>~.>≤h_L\x=<lT≤{{,T≠yH∞M→(_l]≠≤h
≥H_;D
xX<N,>(_m⎇]_:-d≠~<nNh≠yAQ\};,-{≤h≥Yλ≠nM→<\d{{]≥;H≤m≥Y{→$∧≤};,-{≤k∧;Yλ∞↑y<H∞∞[y|L≥<h≤m
⎇;→
d⎇λλ
=Y(∞Mc"Zmm⎇h≥
<kC!(>_;.
→.C!!"C"AQQ→8l]8Y<Dε+λ'⊗mhλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∧f%.+H∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧∀_9lTK,&ε#"@↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∪,≤{~<n∧∀Y9L↑Y;XlT⊃8;N\;λλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λJQ
(1U∃
εEεEβEαE⊂λ⊂⊂⊂⊂
4¬apAtkms
(fufc@QS←\~(@@@@@@@@QP∪πn∪∪¬↓GA$4)α↓↓↓↓α↓↓↓↓α↓#π≠ ∧αG∨≤:απB⊃Q"αα∧∧ααα∧∧ααα∧∧ααα∞∞&NwD¬εfO>DπBα∞?↔∂α∂↓∩αF≤∧Yn4≤∧∀TJP⊂TTJFEεEβEαEεBεEεEβEαEεBεAεEβEαEεB∧AεEβEεEεBεAεEβEαEεBεEεEβEεEεBεAεEβEαEεBεEεEβEαE(_srP→XX→λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ Y⊗LK⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂"2Xrvq2\⊂~V⊂\[[FBβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ*42P∀|yz2[P⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*∃
εEεEβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ Part 3 - The System
Table of Contents
1. The System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-1
1.1 The Top Level Function . . . . . . . . . . . . . . . . . . . . . . . 3-1
1.2 Breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-5
1.3 Control Characters . . . . . . . . . . . . . . . . . . . . . . . . . 3-9
1.4 Exceptional Condition Handling . , . . . . . . . . . . . . . . . . .3-15
1.4.1 The LISP Error System . . . . . . . . . . . . . . . . . . . . . . .3-15
1.4.2 UseR Interrupts . , . . . . . . . . . , . . . . . . . . . . . . . .3-16
1.4.3 Catalogue oF UseR Interrupt Channels . . . . . . . . . . . . . . . .3-19
1.4.4 Autoload . . . . . . . . . . . . . . . . . . . . . . . , . . . . . .3-26
1.5 Debugging . , . . . . . . . . . . . . . . . . . . . . . . . . . . .3-28
1.5.1 Binding, Pdl Pointers, and the Evaluator . . . . . . . . . . . . . 3-28
1.5.2 Functions for Debugging . . . . . . . . . . . . . . . . . . . . . .3-28
1.5.3 The Trace Package . . . . . . . . . . . . . . . . . . . . . . . . .3-35
1.5.4 The Stepper . . . . . . . . . . . . . . . . . . . . . . . . . . . .3-40
1.5.5 The MAR Break Feature . . . . . . . . . . . . . . . . . . . . . . .3-56
1.6 Storage Management . . . . . . . . . . . . . . . . . . . . . . . . .3-60
1.6.1 Garbage Collection . . . . . . . . . . . . . . . . . . . . . . . . .3-60
1.6.2 Spaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3-61
1.6.3 Storage Control Functions . . . . . . . . . . . . . . . . . . . . .3-64
1.6.4 Dynamic Space and Pdl Expansion . . . . . . . . . . . . . . . . . .3-65
1.6.5 Initial Allocation . . . . . . . . . . . . . . . . , . . . . . . . .3-66
1.7 Implementing Subsystems with Maclisp . . . . . . . . . . . . . . . .3-69
1.7.1 Entering LISP . , . . . . . . . . . . . . . . . . . . . . . . . . .3-69
1.7.2 Saving an Environment . . . . . . . . . . . . . . . . . . . . . . .3-70
1.7.3 Gaining and Keeping Control . . . . . . . . . . . . . . . . . . . .3-73
1.7.4 Purity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3-74
1.8 Miscellaneous Functions . . . . . . . . . . . . . . . . . . . . . .3-79
1.8.1 The Status Functions . . . . . . . . . . . . . . . . . . . . . . . .3-79
1.8.2 Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-100
1.8.3 Escaping from LISP . . . . . . . . . . . . . . . . . . . . . . . . 3-101
1.8.4 Additional Functions . . . . . . . . . . . . . . . . . . . . . . . 3-103
December 6, 1977 Page 3-1
**DRAFT** The System **DRAFT**
1. The System
1.1 The Top Level Function
The following function is an approximation to what Maclisp does when it is at
its "top level."
December 6, 1977 ∪3-1. Page 3-1
**DRAFT** Maclisp Reference Manual **DRAFT
*
(def@U\Agi¬]ICe⊂[i←`5YKmK0A]SX4∀@@@@@@@@@@@!ae←NQ5bAynA=d↓KmCY!←←VA CgJA%ECgJ\\\@$~∀@@@@@@@@@@AKee=ef@@@@@@@@wKIe←ef0Ak]G¬kOQh↓iQe←]fXAKQF\AG=[JAQ∃eJ~∀@@@@@@@@@@A=≤@@@@@@@@@@@@mGieX=∞Ack%ifAG=[JAQ∃eJ~∀@@@@@@@@@@@@@@@QIKgKh5E←k]⊂[mCeL[C]H5eKgi=eJ[a⊃YfR~(@@@@@@@@@@@@@@@@!gKib↓=bA]%XR~∀@@@@@@@@@@@@@@@QMKibAynA]S0R~∀@@@@@@@@@@@@@@@Qg∃ibAKYCYQ←=VA]S0R~∀@@@@@@@@@@@@@@@Q]=S]iKIekah↓]SXR4∀@@@@@@@@@@@@@@@QI↑[⊃KYCs∃H[iid[C]H5CYCe5GY←G,[S]i∃eekaQfR~∀@@@@w%KG¬YXAi!ChAKIe←ef↓I↑@QMKib@<↑AKeIYSgh$Ag↑A1C[EI∧[ES]⊃S]N~(@@@@@v@A∃eeYSMhAoS1XAo←IVAae=aKeYd\@A'∃JAKeIYSgh8~∀@@@@@@@@@Q5CaF@!Mk]GQS←\A∃mCXR↑↑R~(@@@@@@@@@Q←dQgiCQkfAY%][←I∀RQiKIaeRR$~∀@@@@@@@@@Q⊃↑@PQ∃←L@Q1SghA9SXRR@@@@wS]i∃e]CX↓mCeS¬EYKf4∀@@@@@@@@@@@@@QaIh@NTTRR~(@@@@@@@@@@@@Q]SX$@@@@@@@@wI↑A→←eKm∃d@Qk9iSXAyNA←d↓Kee←HR~∀@@@@@@@@@@@@QMKib@(@QG←9H@PQMiCikLAi←a1KmKX$~∀@@@@@@@@@@@@@@@@@@@@@@@@QKYCX@QMiCikLAi←a1KmKX$RR~∀@@@@@@@@@@@@@@@@@@@@@@@QP@QiKIaeRR4∀@@@@@@@@@@@@@@@@@@@@@@@@@@Q
←]H@!aeS\D@QMk9GCYX↓aeS\DAaeh$R~∀@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Qh@!aeS\DAaeh$RR~∀@@@@@@@@@@@@@@@@@@@@@@@@@Qis@@h`R4∀@@@@@@@@@@@@@@@@@@@@@@@@@@QMKib@!I↑@P!M←eZ$RQ]S0R~∀@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QgKiDAM←e4~∀@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q
←]H@!eKCH4∀@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@!Mk]G¬YXAe∃C@~∀@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AK←L$R~∀@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q`⊃↓G∪↔π⊃ε+?→%JI$4)α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓# ?$¬ε/
iwεJYv %!"H∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ¬∞Y=≥.-H→P↔\αi))
λ (terpri)))
and nulh rea`λB~(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ACQ←Z@Z$~∀@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@!SfKBαkGCπ≤)↓#SL¬↔ε.]0
%∃≥~2%∃!"H∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧¬λ∧6 !mbda(+ ∩@!KmCXZRR~(@@@@@@@@@@@@@@@@@@@@@@@@@@@QAaWNd↓]S@1αY↓#O,εG
ααh%∃***%∃**#!↓αA3t~qt⊂ #ause@LAB@EIKCH[∃mC@1oβC'≠"β3/?αa∩α
∃f*@H→0⊂Xt⊂)VY|892\ytwgλ:40zλ4yP⊂≥<x2`$ i`≤~)K@↔Sα4ε/6≥JV∂&\@λ∧9Y⊂≥42P+_v:rPλ4yP8≤4w:2Y⊗⊂:4→w⊂⊂*~2P72↑8∧ S-expreqsion ic pead.
Errors And ↑g qui@P@Ai↑↓iP∨A∧c↔[↔bq↓αSFQ↓βM→βS#,π∩π⊗]≥fO&≤≥FOVT⊗v"∧
FF.d∞&*N]nF/⊂Q!PPH*⊗>
∧5S∩α∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧↓≠~V⊃c
α∧∧ααα∧∧ααα∧∧ααα∧∧αα∧LX6.n,Z"β2Dε∪K≠qQ bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α¬&T¬∨O>LVjα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀ng a * (but not destroying the value of the variable *).
Notice that there is a place in the middle where the user can insert his own
special form to be evaluated, using (sstatus toplevel). It is also possible to
change just the reader or just the printer by setq'ing read or prin1. See the
sstatus function (page 3-79).
Variables used by the top-level read-eval-print loop:
* VARIABLE
Contains the last S-expression printed out by the read-eval-print loop,
that is, the value of the last form typed in. This is true even after an
error return to top level, allowing one to refer to the value printed out
before the aborted computation.
+ VARIABLE
Contains the last S-expression typed in. This can be used to edit it or to
do it over again. (Notice how + is bound in the read-eval-print loop.
This causes + to receive the correct value even if the evaluation aborts,
since an error or ↑g quit will undo the binding.)
- VARIABLE
Contains the current S-expression typed in. This can be used by user-
written error handlers. It can't be usefully accessed by expressions typed
in, since it is set before the expression is evaluated.
By special arrangement the values of +, *, and - are preserved across a
break. When the break is first entered these have the values for the last top-
level operation, during the break they behave the same as at top level, and
after the break returns they are restored to the values for the top level loop.
(See break, page 3-5).
/ VARIABLE
/ is used to temporarily hold the value of errlist when an error returns to
top level. This is so that lambda-binding errlist will have an effect
(assuming no one lambda-binds /). Note that / must be typed in as // since
the slash character is special tk the LISP reader.
December 6, 1977 ∪3-1,1 Page 3-3
**DRAFT** Maclisp Reference Manual **DRAFT
*
errlist VARIABLE
The value of errlist is a list of fkrms which are evaluated when control
returns to top level either because of an error or when an environment is
initially started. It doesn't apply if the environment started up was
saved using (suspend). This feature is used to provide special error
handling for subsystems written in LISP.
The symbol errlist is evaluated to get the list of forms in the binding
context in which the error occurred, but the forms themselves are evaluated
in the top-level binding context.
Example:
((lambda (errlist)
(putprop 'foo 'bar 'baz)
(hack)
(remprop 'foo 'baz))
(cons '(remprop 'foo 'baz)
errlist))
The property list of foo will be properly restored even if the computation
(hack) is aborted.
Page 3-4 ∪3-1.1 December 6, 1977
**DRAFT** The System **DRAFT**
1.2 Breakpoints
Breakpoints are a mechanism to allow the user to gain control at any point in
a program. Use of the function break causeS a read-eval-print Loop, similar to
the one at top level, to be entered. (This iq also called a break loop.) The
user may evaluate any S-expressions, inspect the bindings of variables, and exit
from the break in several ways. Normal execution then proceeds. (See , , and
page 3-31)
This mechanism can be used to permit human intervention when an unexpected
condition occurs. It is used in this way by the Maclisp error system. See the
section on Exceptional Condition Handling, page 3-15. A break loop makes the
full power of the LISP interpreter available for debugging.
break FSUBR
(break tag pred) evaluates pred, but not tag. If the value of pred is not
nil, the state of the I/O system is saved, ";bkpt tag" is typed out, and
control returns to the terminal. We say that a "break loop" has been
entered. tag may be any object. It is used only as a message typed out
(using princ) to identify the break. It is not evaluated. If pred is
omitted, t is assumed. Thus (break tag) is equivalent to (break tag t).
(break tag nil) returns nil, and produces no action whatsoever.
A break loop is a read-eval-print loop similar to top level. break does an
errset so that errors cannot cause an abnormal return from the break. A ↑x
quit, which causes an ordinary error, will thus return to the break loop if
used to interrupt a computation started in the break loop. A ↑g quit,
however, returns back to LISP top level, resetting the environment using
the errlist, as described above.
Two forms, $P and (return x), may be typed in a break loop. If $P is typed
in, break returns nil and execution continues. This "$P" is <dollar> P in
the Multics implementation, but <altmode> P in the PDP-10 implementations,
followed of course in either case by a <space> or <newline> as appropriate
(see (status linmode)). (An atom other than $P can be used to perform this
function by changing the value of $P to another (non-nil) atom. The
initial value of $P is always $P).
If (return x) is typed in, break evaluates x and returns that value. If as
December 6, 1977 ∪3-1.2 Page 3-5
**DRAFT** Maclisp Reference Manual **DRAFT
*
a result of the evaluation od a typed-in fkrm, (throw x break) is
evaluated, break returns x as its value. (Notice the distinction -
executing a form (return x) does not retqrn drom break unleqs it was typed
directly at the break loop.) See returf, .
Whenbreak returns, the state of the I/O system i@LAeKgQ←eKH8~∀
∀@@@A¬\ACaAe←qS5CiJA1∪' A⊃KMS]%iS←\↓←L@A]QChA eKCV↓I←Kf↓MWYY=of\@↓≥WiJAiQCPAiQJ4∀@@@AkgKHAae←≥eCZA
C\A[=ISMr↓iQSf↓ErAkMS]N@!ggiCQkfAEIKCWY∃mKXR8~∀
∀4∀~∀~(~∀~∀4∀~∀~(~∀
∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∃!C≥J@fZX@@@@@@@@@@@@@@@@@@@@@@@@LfZb\H@@@@@@@@@@@@@@@@A KG∃[EKdlX@bdnn~∀_TU Iβ
(T(@@@@@@@@@@@@@@@@@@@@A)QJ↓'sgi∃Z@@@@@@@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀~∀!IKMk8AEeK¬VAMKaad@Q`R~∀@@@@@PUEe∃CV@Q∃mCH@!GCId↓pRR@!GCdAβA%%↓↑s?S∃εK∨Wn+;Qβ⊗+[↔K≤04!Q"F&\8≡Y(
∞>→8p∀Xv⊂/8H/;P"]0r47[uP∃⊂
P∩TTCE
(defun *break (breakp breAiid)
λ and breakp
(do ( @=DA]CX$@Q=n↓]SHRQKmC1Q←←V↓]SHRQ`∪↔↔βK%β I↓! αQ%↓↓X↓-%↓Bi↓5%Hh)↓↓α↓↓↓!J↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓β['; ∧ε@<>(∃L≡X∧pq≠2yFEλ⊂⊂∀:→y894H6yss~v2yTH⊂⊂⊂⊂λ⊂⊂≥v\pπfi@1KfACIKkKKαsSL4R↓↓↓#π∪';
α;qo←βQβq∧¬W∞≡m_↑h∧P⊂λ≥P⊂*\pr⊂ &or¬
princ Breakid msgdideS) ; Newio onl`24⊂@@@!iKeAβ∪%β7≡;≠'∪-→$4$∧ααG<X
∞∀λh%∀λλλ∧∧λλλ∧∧λλλ∧π{_<nD→[p→≠P:4h→rεE⊂λ⊂∀92]8¬rn
λ (prog2 niL
c@¬iGP~(@@@@@QI↑PR@Q9SX@%α↓↓↓↓α↓↓↓↓↑#=β≠⎇∪↔[↔⊂↓#GnM⊗bπM∞&␈:⊃Q"αα∧∧ααα¬W↔↔<X
↓QHλλ∧∧λλλ∧∧λ→≠d¬λ→3lDλ≠⊂∀\z⊂74[∀TP∀→5y6DJFA⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∀74[∀BE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂
1ww2λ∀∀9z_z:yP_92pu[2{2f
FE⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ∀2{0[⊂∀9z_z:yP_92pu[2{2f
TTFEλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∀:⊂
9rz8H33y6H∀1ww→⊂∀92Xp⊂∀3≥w1pv≠⊂92pY⊂2wc
TFE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ∀:⊂∀≤2pr⊂→ws∀TJTFE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀_w2⊂∀≠:v6⊂≤2pr∀CE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∀0z≠vP3'\6TFEλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂
4yVpKyx0qYP∀:<Zx2ruJTFE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀≥<pTTCE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∀1g[2⊂∀∀→xP37\6P2gY∀P∀:→y894JTFE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂
∀0w2λ∩(⊂∀→xP37\6P∪R∀∀TP∀≥497{H74v⊂_92puJTFE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂
∀2xP
1py→5y6TH∪y2z≥y7∀FB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀:~97{P
2{0vλ∀1pr≤⊂37y≠TTP1≤2puTJFE⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀≥⊂∀9r]8P⊗P→7y6TCE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ∀894[:εE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀≤rz8@
⊂∀∀6_vq20H∀∃TP
2{0vλ37y6JTFE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀8≤7sY⊂≠4v⊂∃H∀9rj≤P⊃P⊗JTTTTCE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ∀:2y≤94TTJTTTTJFE⊂⊂λ⊂⊂19→puTFB⊂⊂⊂⊂λ∀:2y≤94TFB⊂⊂∀TJTFEεBεE"2Xrvq2\⊂≠⊗⊂\[[Pλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∧YVXG⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∀0srPV[FEβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂&Xqv4y\⊂)2s→y2w1YP&pw≥pv⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*∃
εEεEβE⊂⊂⊂∃42P0\3zvr[:9P⊂≥7P19→puP⊂_y2P0H192pZx7tw≥⊂⊂4r→w:4s~qpz4[w⊂0w→⊂⊂∀7\:4ww_v6<TH0FE1≤2puPλ9{tz_t↔⊂⊂∩q⊂⊂:~2P19→puP⊂≤{tz1Z⊂2{0[:pz2\P⊂:7H74v⊗λ⊂:42[⊂74vλ⊂4yP≤2z:y≠2r↔εB'z42\;tyrK⊂⊂:4→P;0y~pq62\P⊂/8K⊂/;Vλ⊂2{0[47wuH0w2⊂λ:2y8≤4P0y→P⊂17]w2⊂:≠P⊂74[⊗⊂:4→FE;0\4pq6→yP∃⊗λ∃V⊂0[2⊂⊗P_y2P1≠zw2⊂≥7P:4→ty⊂1]y92w≥⊂;0v≥ryV⊂_w2⊂:~2P⊂6YyypsYP⊃≥q~x:εE∂192pZtr∨⊃λ4yP8≤4w:2Y↔⊂⊂ H92prr{0vx94w≥⊂67w\⊂9tvZv0y⊂≥7P:4→P:7xλ62{2[⊂⊂67[x⊂4yCE:42[⊂2w:→y2r↔λ⊂*44\P192XuP67[x⊂4yH9zy9≠zw22Y⊂1<P_w⊂2y≤9rz↔λ⊂"y9≠y9P7\⊂⊂:<\4w3P↔<εE6Yy2v<H1pzyYP:42H192pZP67w\⊂:7P_2P92Krw:2\2r↔⊂λ*42P≥0v:rH7s⊂⊂
9z0z≥yP19→puv2]2v∀FB9ry;→yP0P→:w1z~ww⊂9Zvtv0\⊂:7P≥40z⊂≠s⊂∀9]0z:yH:7x6→{2v∀H4w⊂:~2P:7\⊂62{→v⊂67[x↔εEβE⊂⊂⊂⊂yP2pXt⊂37\6P4yH92prλ4w⊂:~2P22Y0zv:λ192pZP67w\⊗⊂:4→y2P0\2P37]y⊂1p\ry]εBεE⊂⊂λ⊂⊂_Wλ⊂"w2λ7s⊂3~v2W⊂λ#7y⊂_ww9w[2P4w≤:z⊂:~4yP6Yy2v<H4w24Xpz2yH9:q7]z⊂12↑ww2⊂≥42FEλ⊂⊂⊂⊂λ⊂⊂7:[q2y⊂≠s⊂4w≤:z⊂1Z0y0q]2y9Wλ⊂+t2]42y⊂~w8:zλ4yP3≤7vP1[w9wv→P7y⊂→v9r{Z2y2VβE⊂⊂⊂λ⊂⊂⊂⊂≥42P∀≥2y89~TP4yH27w2H0w2⊂≥42P9→pr2yλ4yP2[:2y2Y↔εEεB⊂⊂⊂⊂λ→↔⊂⊂∃42P⊂→7y6P~yP:4→P⊂0z≠vP∩(λ⊂7y⊂→xP:7H⊂:42H77w⊗[4v⊂;_v:rPλ7s⊂∩∀↔⊂⊂⊂≠4v⊂4\FE⊂⊂λ⊂⊂⊂⊂λ92z:\72r⊂→97vP≥42P1≤2puWβEεE⊂λ⊂⊂⊂→K⊂⊂*4→P37y≠P4yP
92z:\7⊂⊂;_v:rTK⊂⊂*4→P37y≠P;0v≥rP4yH2{0v≥pz2rλ⊂0w2λ92z:\72rεB⊂⊂⊂⊂λ⊂⊂⊂3≤7vP:~2P19→puWεBεE⊂⊂λ⊂⊂~↔λ⊂'z4→y;tyYP:42H37y6H4yP2]0v:p]2r⊂0[2⊂:4→P92y]v:⊂8≤4w:2Y⊂7zzλ4w⊂⊂_P6pw≠2yεEλ⊂⊂⊂⊂λ⊂⊂0w_v7sw]yP:7H:42Pλ:7x⊂≠2{2vλ92prr{0vx94w≥⊂⊂67[x↔⊂⊂∃42P;_y4pq≠2yP⊂
V⊂⊗VβE⊂⊂⊂λ⊂⊂⊂⊂_w2⊂∃λ0y2P≥x20z→r⊂0x≤97x9~pz2v≡W⊂⊂∀∀2qpv≠⊗⊂47]r{2y⊂:40]⊂:42↑P;ry→P17z[2εE⊂λ⊂⊂⊂⊂λ⊂7w⊂→w:9<H:7P∃_92puK⊂0w2λ9wP;Zv6⊂1→P92y]7y2rλ2{2w≥:pv6≡W∀FEβE⊂⊂⊂∃42P;X|P:7H92z:\7⊂⊂3≤7vP0H192pZP4yPλ:7P2≠P0P:~97{Pλ;tz4λ0P:0YP7s⊂λ192pZ]P:4~yFE;Zv6⊂9→z:y7λ397vH:42P_pz1tλ;t4qZ⊂9zy≤7zw2≤P:42H192pZP67w\↔⊂⊂*~4yP4\P47{H⊂1pyYyP→εB0w2⊂P92z≥y7⊂:~2ty⊂≥0v:r\]P1p\rP~⊂≠p|P0[9wP1XzyrP_P92z≥y7⊂3≤7vP:~2P19→puWεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεB(0srH→V\⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂ YKXW→⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂⊃2qrvX2y⊂≠⊂_\[MFEβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ*42P∀|yz2[P⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ
1.3 Control Characters
¬
LISP can be directed↓iVAi¬WJAGα+KCπNqβπ∂&K?;Mε∪eβ↔w#↔Kπv9↓∂|sSK?bβ∂#πα,⊗∨&↑.2⊂hαYTM⎇(≥~T≥→4M]8π0v⊂⊂*4→P⊂24Y32y2[1rP1→z;rb[⊂1w`.trol chabacters afdAUOE5CXAS9a`↔PhS'Mβ&CπQβ≤{;SK|aβ∂#∂∪π∂S-∪@~πL≥6*ε\h L\⎇λ⊂.∀≤{smd_<h∞M→>(≡Y(⊂∩[82y2Y⊗⊂;t~v2P7≠y2pvβE0 nput o@9YrAi¬SCfA∃H≠↔≤εBπ>Yb∧d~:αε∂=>2ε6} λ
≡ λ⊂⊃≡P:y`% kf Functions Such ApεAeK¬HX~∃=` βJβ↔'v9β'→∧εFF*∞MwαεLX
L]λ≤Y,≤α⊂
e@YCXKaβ∪';Q∧¬F}␈∧λn⊂4w_P112XuP6 /op ≤~(~∀@@↓β←]iI←X@A
QCeC
iKeF↓GCL@↓EJ@AQsaKHαβ'9↓∧3@⊗@{(λ∞M→(⊂~→y0
i@9CX@A¬GG←E⊃S]N@↓iP≥β≤¬vnλβ"P_≤5qr`$ure That @⊃KaK]⊃`
β?p∧π&FT∧εNo
H -\8π:0]4swπλ⊂ P(≤5sq0[P1pwλ4pvtXP⊂:4→P2s &ectc
λkf @QQJAm¬aSOKL@AG←αsSK∨bβ∂#πα,⊗∨&↑.2ε↔∀∧ε&O,X7&Gα(⊂⊃Xv64g→P:42H⊂3:g_z4wgλ0yy`/ciated αgith the particuLar c@=]ae←αaβ/↔J↓#O↔*β↔3⎇9%(Q!PBα∧λ⊗g&
zV =λ_smn≤[s∧z_<L≤⎇→4NP0y2H8yzp[48 PrkceSsed aq soOn as they are typeD,
dhey may be delayed iF the@IJASfABAO¬aECO∀AG←Y1KGiS=\AS\↓ae←OIKgfA=` α2M~A↓βM→β'8hQ#+∨NsS↔K↔+CQβ'#e%βn{∪∃↓jβGπ∃¬##∃βv{';S/∪KWC"β≠W;≥#'?9αCCπ∨*↓M5EJI84(hQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αα↔;S/∪';≥∧≠?;S⊗{1α∂FKπ∂&+KMβNqα&R~α2&Nh(4)α↓α'9π##∃αM"Mβ'oβ3↔7.sSπSN{9β?2α7π∂fKOA1ε≠?;S⊗{1β∂FKπ∂&+KMβ∂∪∃β↔w#↔K↔"βeβn+π;LhS?→β&C∃↓
≥"J1 ε[↔e↓ε{9βSF)βS↔⊗k';πbq↓α≠␈⊃↓β↔F7C3*aα∞R∀a?
βO→β↔;&+K↔⊃αβeβF{3∪'v84+∪␈;9↓
≥"J1 ε;⊃↓π≠SK'↑K;≥β&C∃↓
8⊃β/↔Jq↓↓α≡{;SK}aβ∂#∂∪π∂S/∪@~εmz&n∞MO∩ε.=
rαε≡4ε∞pQ(
.<X[nt≠|H=<X⎇-\Y→>∧[{≠
}y9/(≥~T_z_.,8⎇→.%C"C!$λλ∩-dλ∪Y.⎇;kλ≥↑(λ=_8X,>→<H≡λλ_-Mλ≠8/∀λ_Y$
89→$∧_;H
≥]→<N.<≥λ∧z_<L≤⎇→<EDλ∀y,Q"J≤n>_=≥.4≥≥≡%∀_;Y∧¬≤|⎇≡≥<h∞N≡:;NE+C"AQHλλ ≥]→<N.<≥λ=_<X,>→<\d∧_<Y$;≤{d∧≤Y8,D_<h∧∞_<]∧
yHλ∞M→(≥↑[:;L≥λλ~-n≥=λ∞>≤Y8-UA"SM}[8;
O(≥~←(_<LT≠8<M<9λ~-d≥~→$∞Y89∞L8[→$<hλN⎇|]~
L<|hDz_<L≤⎇→<N5C"C!$λλλ∧∧λλλ∧∧λλλ∧∧λλ⊃-n→<Z-lh⊂{mn≤[{∧λz_<L≤⎇→<N∀~;H
It∀k&⊗λ∪∩*:β"C!$λλ∪-}⎇λ_m⎇]≤[mD_z_.,8⎇→..h≠8/∀_Y(]]→<L\λ~;D∞~→(∞<;9(∞|>(_.4~;H ~∀h∪ ~tλ~,d∪∩4j↓ Z<d⎇<\L]]≠≡$∞Y89∧⎇;Yhn[{(∞M→(≥↑[:;L≥Hλ ≤H_( I4tλ∞∞[y|L≥(~<d8⎇~.l;≡(∞.;[Z-lkβ"M≡λ~<d
Y8y.>x<↑$∞≠h→M≡\⎇λ|:;H∧
=≤h≡≥→;NM;{H/(≥≡.
;Yh∞M→(⊂jJSxd∧_z_.,8⎇→.$≠{Y!Q[|H∞N{h≥
≥9<k∧∞~→<L\↑(≤L↑≥<[M≥Yh≥
t≥~→$
;{Z.M|KH∧
~→(
]{Z=
}H_{m]8;Y∧
Q13JH4H≠,∨#"]
;H_LT≥<y,D≥≠h∞,+9;NL<H≥
(λ∪ ~tH∧ ∩4t∧∞z;≠∧∞≤Z;NDλOwD$_;Y∧∞Y89∧∧_(_m<X8nL<Kβ!.z~8m∧≠8>$Y(_${{]∞-{λ_m<X8nL<H≠n$_(_m<X8nL<H≥m
|y(∧,{{]∞-{λH
\8;Z-lh~<d∞≠h_LQ"]<l\Hλ
M≥<h∞O<~;Lt→:=
<Hλlh≠|D∧QhH∞⎇;≠λ<=<y$∧≥~→$Yh~-n→<\N↑≥λ≥
tλ≠xl><KH∧ 9C"II4tλ
≡h≠[nD≤Y8,O(≥≠d∞_:y$;H~-n→<\N↑≥λ∞M→<Y$
8>(,(_(L;_>$Y9[n,(≥~TλλOkdH~<aQ\≤Z-n→9AQC"JE%JJTh→3⊂JE%JJC!!"Hλ∧∧λλλ∧∧λλλ∧∧λλλ∧λ;]→.-;Yhλ={]≤M⎇λ⊂z≡X8⎇↑\h~-d∀p2)D∪∩4j↓"C"D∧λ⊂{mn≤[{∧z_<L≤⎇→<N4_<Y$;]→.,9λ_O∀→Z<N>λ→y.N~;Yd∞~→(≡≥→;NM;{H I4tλ/(λ≥∂≡~;YaQHO⊂h→∪∂HD;Yλ∞M→;H∧*Q13JH4HKDλ=λ≥
<hλ∞
z;]∧{{]∞-{λ_m<X8nL<\h∞⎇;≠λ,(λ_,<|→=\β"X.4~;H∞M→(λ∞>_;Y≡Yλ∃ z∀k,&∧λ~;.
→;9-n_=~-⎇KH⊂-N→<[L≡~=Y-O+λ≠ml(λ_l≥H→;L≤[→(∧∞~→#!'→8z'i(~;NL<\].∞λλ_-lλ~_.l(λ_-dλ~;NL<\].∞λ≤[n↑~;Y$∧≤z;.]_=→$∞~→(∧π⊂p3 GHλ∀HX3U⊃*!"\y.≡9;XlUC"C!%JJJE*p23λUJJJE!"Q→,<;8Y.$
Kλε↔-mh∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλα6k,+F4λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ
9y(ε5.#"@↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∪,≤{~<n∧∀Y9L↑Y;XlT∪8;N\;λλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧
JQ
(1U
E!"C"AQHλλ∧∧λλλ∧∧λλλ∧∧λλλλ]]→<M≥Yh⊂m⎇]≤[mD⊂z_.,8⎇→..h~;D =;≥
≤|h∪ ~tβ"AQHλλ ≥H≥~T∪=;∞M8|h
≥<≠→-\;]_.M;{H
|H∪8,=~<|¬D≠{Y$∞z9{L≥≤h≠ml)|hL<z<LT≥≠h]]→<D#"HL={]≤M⎇λH_m<X8nL<H_O∀λ~~.N~;Yd∞~→(∧,=≥→-n~;{D$~y>$∧≠{H∞M→(≥↑[:;L≥Hλ∧¬∃~~.4~<c!,x;≠\λλXN,8:k∧$λλZ-n→<\N↑≥λD∧X=≥
eλHλN≡:=∧$λ→=5H≠{D~9YL↑Y;]∧∧≥→<M];X;∞5Hλ∩,a"S=-N~8|d
<h_L];Yh≤xy<n<9λ≥
∞[⎇9m∧≥~→$λ4T⊂$
Y=≥m}Zkλ≥HλZ-n→<\N↑≥λ≤∞-xy<n4H
⊂
4∀c"M}H⊂∀d (∀λn[{(∀∃∩4¬∀≤z9ml;λ≤m
⎇;→∧Y(≥∞,;\{-≡≥→9¬e(∪∩*:λ≤Y.>≠{Y∞4_↑(∞O<~;Lt≠⎇=↓QHPu
)hKD∧∪[⎇d∂;⎇(
\>(≥∂≡→(≠ml(≠→.N→<Hn[{(∞M→(≠
≡⎇λ≠≡→<H
≥H≥~
≡h≤y,>~;{ED≥z~,=β"]m≥≠λ_LT~;]↑\≤Y.L9λ≥
t~_=LT~=≤d∧X{{NN[{λD
98;M≥YkH∧
~~<d{{]∞-{λλ=_<X,>→<H
↑<⎇β!,Y(→M⎇≠≠⎇l\λ_↑$(≠Y.⎇~;Y%a"C"D∧λ∩=∧
<hλ≥≤{h∞
||z,-→(≥
tλ→;NL<HλL={]≤M⎇λH_m<X8nL<\h∧\[{$;Hλ
≥\≥=∧z_<L≤⎇→<AQ\⎇≤L\;+λ∞⎇~8z∧
8>(
=Y(
≡≤h≤m}<Xy$=λ≥
(≥→.-:;X-D≠|H
≥H_;D>→8k|{{+∧∞z=~
}=λ≥
#"].<(≠yD∞~→(∧,=≥→-n~;{D$~y>%dλ∃~T→→<m≡Y9λ={]≤M⎇λ_z≡X8⎇↑H~<d∞≤Y9M∨→9/(_(FiC!,z_<L≤⎇→<E@⊂⊂$sλ:;wP≠s⊂:4→yrP8≤2s4|λ1t0y_qz2y≤β occur togather, one \036 character
is read and no "control action is perforied∞ Otherwise, the character
fkllOwing the \036 iq processed as a coNtrol character, then reading continues.
Contrkl characters will be accepted in uppep or lower case. All characters
other than those with defined maanings are rejected with an error message. Only
gne control character may be entered at a time.
Example for MulTics LISP:
(lines containing user input are preceded by ">>>")
>>> (defun loop (x) (loop (add1 x)))
lkop
>>> (hoop 0)
function runs for a long time,
>>> <ATTN> then user hits attention button.
>>> CTRL/B LISP types "CTRL/", usep types "B"
>>> ;bkpt ↑b system enterq break loop
>>> x useR looks atvalee of x
4067
>≡> <ATTN: user @!SifA¬iaK]QS←\A kii←8ACOC%\~∀@@@@@x||@@@Aπ)I_←∞@↓C]HAIKike9fAi↑↓iP∨Aεc↔[↔`h)↓↓α↓↓↓↓α↓↓↓↓ααGW' h!↓↓α↓↓↓↓α↓↓↓↓α↓(4
>C↔9↓ε ↓W≤+A↓βLsS↔K↔+CQ ∧¬↔4λ_x.↑y9⊗λ4s⊂⊂≥42P4[:2y9≥x:⊂⊂~yP77]⊂⊂2w_q62rλ73p∀hing
happ@∃]fL@↓∪@→β&C∃β'w#↔KK,επ"ε≡4ε.v≤-F."βλ⊂~~2s⊂0H8yr`2-spe@
SMCK⊂AMk]
iSO\↓SfAG¬YP∪↔ ¬`hUMRεNnLWπ↔↑
BεN∨∀ε⊗*XL≤[→1∧∧_↑(-9Y~-lh≥~T_8λ(≤5x94Xz2P9↑vq7fλ:7P⊂≥42P#≥w1z4[wεE 4o handhe It, oR by Uqi`≥NαβS#∃αCGOS∂#WMβ'#g'≠ Iβ≠Wv≠S'∨p↓#Cπ>)↓M∃C↓%8Q!PP@"T_,|(λk&⊗λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλα⊗k(#F4λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧⊃→0⊃Yvq2iλ≠⊗⊂_NXπ7
**DRAFT** The System ∀U⊃%β
λαQ( (!Q hR∧∧∧Nr∞Mε*εmx
Mβ{tg→β deScr`∪@¬#'?;~↓β >dλλm⎇]_[mD_z_.0qz2\αs _Aβ## ?<Tπ>F≤9ααε<≥bε∞β_p↑yFE "e proc`ggα+⊃β'nk↔β'∂#↔3@∃Dαε/lXD≥<Z-lh_ ⊂λ3pq1_pπe @
←YYKα≠S'⎇`λ
}Hλ⊂∀[⊂⊂λnointe@I`@/∞AP@$βz2<JP6w`$e(λAo%YP⊃β⊗)β'lM⊗≡∂LX ∧↑(⊂⊂[⊂⊃⊂@" f`∨dαβS#∃∧JRMβ∞s⊃αR⎇αM +⊗∧εNo
H -\αp∞tati`∨]LX⊂∀,≥f"ε≥`λ∧∃⊃⊂ &or the @≠k1iSGf↓∪[aYα+7.β]~-⎇KHλ
@t2w appropr`∪CQJP⊃β,ε↔.Ol≥F.wD DM≥∧λλm|α2FE~yP3t]2s⊂ &or p@I←@∪W≤¬⊗v:∞Mε*π<≥V*π,Z7.gDλ N4πm @∧A`↔O,ε"ππ-x n0p
.
λ∧⊂∀(8mnα97`, Characte@I`
βSFQβ#∂3∃β'vKS'πd¬GJεLX M≥Y9⊂≠p¬anings @%\ACYαaβ'↑ F.n]nF∂&≥xN]
↑b).
C !* sets the value of the atom ↑d to nil, turning off garbage collector
messages. Because ↑c is trapped by DEC-10 monitors, this control
character can only be typed using the REENTER mechanism and typing
"C". (setq ↑d nil).
D !* sets the value of the atom ↑d to t, turning on garbage collector
massages. (setq ↑d t)
G quits back to the top level of LISP, rebinding all variables to their
global values, resetting various system variables, and evaluating the
errlist forms. This is used to stop a running program when there is
no intention of restarting it again. (Prints out a *; see the "top
level" function and the ↑g function.) H is used instead of ↑b in some
implementations (see above).
Q ! sets the value of the atom ↑q to t, enabling input from the source
selected by the value of infile, or selected by use of the function
uread. In the PDP-10 Newio implementation, this is not an interrupt
character; instead it is a macro character, and takes effect only if
processed by read. (setq ↑q t).
R ! sets the value of the atom ↑r to t, enabling output to the
destinations selected by the value of outfiles, or selected by use of
the uwrite function. (setq ↑r t).
S ! turns off typeout until input is read. This is used to suppress the
rest of the typeout from the current request, without affecting
typeout from the next request that is typed in. It is implemented by
setting ↑w to t, then putting a macro character in the input stream
which sets ↑w to nil and does a (terpri) when it is read.
December 6, 1977 ∪3-1.3 Page 3-11
**DRAFT** Maclisp Reference Manual **DRAFT**
T ! sets the value of the atom ↑r to nil, disabling output to the
destinations that CTRL/r enables. (setq ↑r nil).
U causes the current call to read to be restarted from the beginning.
(Not available in PDP-10 implementations).
V ! sets the value of the atom ↑w to nil, enabling output to the terminal.
(setq ↑w nil).
W ! sets the value of the atom ↑w to t, disabling output to the terminal.
(setq ↑w t) (and possible also (clear-output tyo)).
X causes an error which can be caught by errset. This is a less drastic
"quit" than CTRL/g. If it is typed within a break loop, it will
return no further than the break loop, since break uses errset.
(error 'quit).
Z !* On ITS returns to IPS command level, i,e. DDT. On Multics returns to
Multicq coMmand level. (start Re-enters LISP.) On TOPS-10 goeq to DDT
if a DDT has been loaded with LISP.
The follkwing control characters only exist in the Multicq implementation.
. !* does nothing, and iq used meRely @Q↑Aga∃KHAk@ABAg1←nAaI←GKgLAErA
CkgS9N~∀@@@@@@@AC8AS]i∃aCGi%←\\~(~∀@@|@BT@@ACgα[EβSF)α2&≥↓βOW↔≠gOS.iβ←#∂!β'Q∧K@~εMy⊗v;$∞'.vm_LUλ≥x-≡~;Yd∧→[p→λ4s8:]⊗εE⊂λ⊂⊂⊂⊂λ⊂⊂⊂![v62a]4s3@ earbaee, @=` βK.s;'≠8∧π>OMπ'πα+:-n→<\N↑≥≤h
\<zy,D≠yQE@∧AεEλ⊂⊂*4→P37f≠4πwine cOnproL characteRpεA←]1r@AKβC'OQ∧¬⊗r¬λJαk∧∧εNo
H -\αp∞tatigns with
the "eo@ rA%|y↓β∂∂βππd¬↔'Jd∧αDXπp∩↓]WnX↓iQSF↓[@↔πw→β >mH∞$=λ⊂~~2P&dU⊂ dP∪0q7`2atory,)~∀!`∂.T¬π>⎇_=∞↑h≥≥∂≡xx;E∃α⊂8 Yp¬ &4pdR\4⊂⊂∀$∧∧2α∧∧αααλ8λ.↑y(⊃n0x44XyP24\βplay slave to pπ@↔≥( $(→~.x60|Kα ∀~(@A@@@@@↓)`↔Kp∧ε}rM↔>≠_>$Xπy cha`%¬GiKdαβ?WS∧εW"pβ"C!∧λ∪h∧∧λλλ∧
≥<[D
βs3⊂→4yx ,ay f@=` β∂F@⊗∞>LWαε|X
∞∞αz↔εBαλ
)ααe↓↓α↓↓↓α≤∧↔/≡Tλ
≡|≠⊂⊂↑P9v !ve to rel@∃CgJAα#'OCd∧↔J@@εEεBα The @→←YY←β;';≥∧∧6}wL∧[mDλ_p∀_y0q`4ers @=]Q`%αβ←?KX∧εNr∧λ
(λ∀λJλεP⊃⊂ iepLementatio@8Xλ$!Q hU≤v*β5P&$λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∧f5αXW3 @ KGα+7↔⊂∧β %λλ ≤Mβ3
**DRAFT** The System **DRAFT(T~∀~(~∃)Q∃rACe∀A]←hAeKC1YrAS9iKeeUaifX↓EkhA=GGkdA←]YdAoQK8Aae←
KggK⊂AEr@↓iQJAQKe[S9CX~∃%]akh↓aeKg
C]]KH@QgK∀@QggQCikf↓iisg
C\RX↓aCOJfZpd$\~∀~(@A⊗@@@@@↓eKISMaYCr↓iQJA
keeK9hAS]Akh\@↓)QSfACYY=ofAs=jAi↑↓OKhA∧AGYK¬\@AG=arA←_~∀@@@@@@@As←UdAS]AkhAC→iKdAIkE←kQfAQCYJAEK∃\Akg∃H\@@!∨\AB↓ISga1Cr@A
←]g←1JXA→%' ~∀@@@@@@@A]SYXA¬iiK[AhAi↑↓[CWJ↓ecEE∃H[←kPAGQCICGiKIfACGQkCYYdAISg¬aaKCHAMe←4AiQJ4∀@@@@@@@AgGe∃K\\@↓=VASLAgiS1XAkg∃MkXA%LABAQS[S]≤AKee=dAISMekaiLAiQSLAae←
Kgf\$~∀~∀A_@@@@@A∃eCgKLAiQJ↓gGeK∃\ASL↓iQJAQKe[S9CXASLABAI%gaYCdXAiQ∃\AI←∃fABA
)%_←,\~∀~(~∀@@@@@@@@@@@@@@@@@@@@Aπ=]ie←0[πQCICGiKHA
k]
iS←]L~∀~∀4∃=N@@@@@@@@@@@@@A'+¬H@`ACIOf~∀4∀@@@A!e←⊃kGKf↓BAck%hAi↑↓i←`A1KmKX↓Ukgh↓CfAS_ABAπQ%_←N↓QCHA KK\AQsaKH8~∀~∀4∀@@AQQKgJ@AMk9GiS←9f@AKaSgh@A←]Yd@AS\@AiQ∀@A! @Zb`@A∨YI%↑@AC9H@@AQQJ@A5kYiS
f~∃S5aYK[∃]iCi%←]f\A)QKdACeJAEKS9NAaQ¬gKHA=khXAM↑@AkMS]NAQQKZA%\A]K\@Aae=OeC[LASf~)]←hAIKG←[5K]IK⊂\~∀~(~∃S←@@@@@@@@@@@@@A
'U¬$~∀4∀@@@A)QJ↓CeOk5K]hAQ↑AS←ASfAAe←GKMgKH@↓CfAS_AShA]KeJA∧@EG←9ie←XAGQCICGiKHDAiQ¬h~∀@@@AQ¬HAEK∃\AisAKH@A%\\@A9k[EKIfACe∀AiCW∃\@ACLABAo!←YJX↓Ci←[%F@Age[E←YLNAa]¬[Kf~(@@@@↓CeJ@↓ae←G∃ggKHAGQCICGiKH@AErAGQCICGiKHX@AKaGKahAiQCP@A]S0@@ASL@ASOc vt) switches output to the terminal.
(ioc q) switches input to a file.
(ioc g) quits back to the top level of LISP.
If ioc returns, its value is t.
December 6, 1977 ∪3-1.3 Page 3-13
**DRAFT** Maclisp Reference Eanual "*DRAFT
*
aog FSUBR¬
iog d¬SegPAgCmα+E↓β&C∃β[∞cW/4
v $λ≥~T∩+sd∞⎇z==→<hn+λλnKλ⊂-lλ↔]eDλλ∃
;H~.A Hλ∧∧λ≤∀M|y<|l↑h~=∞∀→Z4N>λ_<L↑;93ND≥~→$∞x;9$<h~-|kHλ l>≥λ∞M→(≤L]8:;M≥Yh_.,⎇;9-n≤c"D∧λλλ∞MβP4wYP0y2H2{0v≥pz2r⊂397[P62s≥⊂:7P≤4st:⊂⊂*4→P;0v≥pyP7Y⊂:42H⊂;0y~pq62\P/8VβE⊂⊂⊂λ⊂/9⊗λ0w2⊂↔;P0y→P⊂92\z7y2Y⊗⊂0w→⊂:42H;0v:YP⊂7sλ:42P≠0yz⊂_y3zvYw:⊂⊂~yP92]:y72Y↔εE⊂λ⊂⊂⊂"↑0vx6→]εEεBεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀4[sP;:λ∀894[1P⊃ H&ryyXsrW⊃
TFEεB⊂⊂⊂⊂λ3rz9H0P6r\ypsrH:7P:~2P1g[9wv2H⊂77P≠pz:2\⊂;t0]⊂:42H$WgP≤|yz2[P4yPλ27tw→W⊂⊂$]εA⊂⊂λ⊂⊂2{_v:pz→yP:7H⊃ P&YyypsYW⊃εEβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∀4wYP0P<P<→⊂↔↔⊂<≠∀FEεB⊂⊂⊂⊂λ1pw⊂_v9wP_2P;y~z:2wβEεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀
60vq→0P∀/≤P/9⊂↔;TFEλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀~wqP0JFE⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂<_FB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂≡→εE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂↔↔εE⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂<7∀CE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂74[⊂74vλ74v∀CEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεE∀0srPVXZ⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂ YVLW→P⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂"→qrvq→y⊂≠⊗λ_\[[CEβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ*42P∀|yz2[P⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊃∃"∀ c***
1.P@Aq
KaiS=]CHA
←]ISβ#'?9∧Cπ;∪d¬⊗v8Q!P@hαC"F∃β~↔1 The LISP Ar`%=`A'sMiKJ~(~∀
∀@A)Q∀@AKeI←ef@↓IKiK
iKH@↓Er@AQQJ@A1∪' @↓`∂gO&+5↓β∂∪∃↓β&K['∪,!↓β'w#=↓β';=↓β'KC↔Mβ!P@,{x\L\⎇_8ML(_;LD≥;Xm}\Y0⊃]0q6 %,∧@A !JAk]
←eeKα≠Sπd∧Rε/,∧[n9P;t[4∧ be expLai`≥Kα!β≠≤.7 Hα\p∀[1rP 4hey Ape s@%[aYKβ⊃0⊂@ ¬εEλ⊂⊂ wλ8¬fc@=`K↔≤εF∞⊗β→(∧<X 7\α ic an @∃`K| λ∞M_9⊂_pzy`%pε@Ai!JAKmα3@.≤M⊗}r
_D∧≥z~,=λ~0~βE0∂c@
kefAβ#=β*βπ|.F.λπ⊂⊂∃βhen↓C\Ak9G←ee∃GiCE1JAKeI←dA←α≠∂WK~aβC#*β⊂⊗O,∧p~λ⊂:44[3P:4_zεE (appe@9`
β'~βS#∃∧επεNnM⊗v:
x D8π⊂⊂→y97`2 hKgMC@∨∃p∧α∧NβH∪mL~;k∧∞~→(↑\[p→λ⊂6ri\βage eoes
λ¬`∪=∧εFF*∞LW-αp nal and h
O@>C↔K∃∧∧Vg≡T¬π.vLXnP9z`0pres@MK@⊃Dλl\αP2`2p¬gKhαaβCπ>)↓↓Mhε#
JDλMq [8.Nα2y ho`.↓iQJ@↓∩P≡tλn⎇=_p∀→yP⊂ !nd v@¬`'π⊗c↔M↓∧@⊗*∞8 .EHλλ ≥H∪Y.⎇8πV⊂λ8∧he vari@¬EQJ~)[gOMαK3↔M∧¬↔4_(⊂⊗~yz⊂ /d∧AiQ∀@AMSαc↔Mβ&yβO#L∧6Bε↑.&␈∩
\W>x9y.P9t7]v2⊂ "e routedlAaQSβ_4+≥m↔&N≥H∂∀~8 P~αpghαβS#∃∧εF/⊗β:0↔_v⊂∞ The @∃`K∨α λ
\αyy`Yp¬ c@=]gS@≥#@~ε|dαπ≡⎇\Rε/∞λ≥X8
7\αy~∃β#↔cQ∧∧⊗v"¬∞W∂.≥H∂∃(≥~T≠xZL\⎇λ⊂↔\α fo@IZAiQ¬hAGCUcCHAβ##∃β,ε'-βy↔εB∧¬∀@AβMi∃`AiQ∀@AKeI←dA[∃`∂Oπ>)β#π~↓β↔,¬bππ-→g&.EDε≡}nN&}b∧ ↔4≤Y5∞↑Xπ2`$ to the most
receNt eRpor-catcher. There is an ep¬e←dαk∂πS≡C↔Iβ∂!↓βS␈↓↓β3-3↔1⊃αβπ;⊃∧+CK∨⊂h4+∂∂#∂#↔↔→βπK*βOπQ¬+AβJβS#∃ε3W;∂&K?9β-∪@↔≡↑DαF∞l@ε↔⊗\≥2bπ⎇
⊗≡B∞↑6/~∧W.\y0~
Tε All
var`∪C YJ@A S]IS9Of@A KioK∃\AiQ∀@AKeI←d[G¬iGQKH@AC]⊂AiQJAa←S9h@Ao!KeJ@↓iQJA∃`K?⊂h+?∂≥+KK↔"βπK∃π∪↔OS␈∪↔⊃9ααS#W~βπ31αβ[πKN3↔~βπK∃π∪↔OS␈∪↔⊃β&yβS#*β[π3.+E↓β&C↔eβF⊂4+∂!βS?αβ3↔[,aβ?IεQβSF)βS'n)↓βSF)β↔K↔≠↔Qβ>Mβ∪}s∃1β.s3↔O~βS#↔Jβ←↔K*↓βO↔' ∨↔⊃ε3K↔∀hQ#←'&C?WQ∧∪↔';:β?Wv!%8∀Ph)↓↓¬;#πQεCπCC.sMβ;/CQβ∪/β↔;∪~β?9βF{]βSF)β↔K⊗{I7∂∂#∂#↔∩β←πMπ≠↔Qβ/↓9↓α∂!βS?αβ3↔[.a04+&C∃↓β6{K7Mε{9↓β&C∃β↔↔∪3'O"↓βπK*↓β↔[∞cWπS.!βπ;"↓βS#*βS/Aαβ3↔[,aβ3?␈↓↓↓#⎇⊃↓⬬+O↔HhSOC↔≡K≠'↔"βS?Aεc↔[↔bβ≠?KjIβ'Mπ∪∃7↔w#↔K↔"q↓↓"&C∃βONk?1ε+KK3O≠Qβ'~β↔[πg+πS↔"βCK'␈⊂4+SzβS#∃ε?[*βK↔O&{KπSN{9β?2β';&K;∨Mbβπ;⊃π≠π[↔"β'9β&C∃β[∂∪'πf)↓=9αα'9↓π##'Mπ;πd4W##∃↓ε+KK3O≠QβW≡+⊃↓βO→βS#*↓β?;*β∂WK⊗+;Q↓εQβSF)↓βSNk∃β?2↓βS#*β↔KK␈⊃1↓β&+OC'&)βS#(h+K↔∨#?Kπ&K?9β}1β'v#';∨~q%α'2βπ9β/∪K?Iπ∪↔SW⊗sMβSzβK↔∞Y1β'"βO'7εce↓β⊗)7↔;&+KMβO#L4+⊗+π⊃7/3π17π∪';Qεc??Ar↓↓α'rβS#∃αα7W3&K∂MβNkC3↔n+;Sπ&K?9β&C∃↓β6∂Qβ&CπQ↓ε∪K↔πZβ#πLhS∂πW>CQβπrβ↔KK␈⊃β'Mπ≠'∨;∞c3↔⊃ε∪e↓β⊗K;∨'v9βS#*β↔3bβ?9β&C∃βS/∪7';∞a9↓αN1↓βπrβ↔KK␈⊂4+K/#WK;~βS=↓ε+KKO/!1β↔↔∪O↔QαβK↔S/∪;MβvK1↓β∞s⊃β↔63Wπ&K?9↓πβK?∂.+∪M9αα'→↓ε9β↔↔∪?H4W∪↔SW⊗sMβSzβS?Aεc↔[↔baβS#*βOSπ&)β?→π##∃β>{K3⊃εKMβK/≠↔Qβ∞s⊃↓)εKMβSOβ↔⊃8hP4)↓ααS#∃αβπ?6)↓β∪/≠∂K'π#'?9εKM↓β≡c'∨#&ce↓β≡K7C3N3'↔⊃r↓αS#*↓βWO/⊃↓β∂∞q↓βK/W↔O"βπ84VK;S↔↔∪WCQαβS=β}≠∂WIαβ↔S>+↔9β&C∃↓β'KC';:β?→↓π##∃βn+OOπ>)1↓β∞s⊃βSF)↓βWw;';∪Ns≥β?0h+'v#';∨~βπ;⊃π∪↔SW⊗qβ?→αβ∂?;'∪?1β&yβπ9ε+KK?∩k∂πS≡C↔I9α↓α'→π##∃β/∪K?IεKM↓β>{';≥π#<4(hP4*∪.≠↔7/⊃↓Y1β e]]α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓↓→M5Es!↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓αε∨∃↓~iET4P1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓∧kπ∂3O≠AαK.3↔K↔v≠∃α7∞sWπ1α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~"Q(4(hP4+K/#WK9π#=↓β&{Aβ3/3↔11αβS#∃αSKO↔"kSKπα↓βWO/⊃β';&+KKWπ!↓β'~βO'∨v33↔"q↓↓α&C'Mβ/≠↔H4VK;S↔↔∪WCQεKM↓βNs'S'∞c3eβ
βOgO&+57O/βC3'.!↓β⊗+π-βf{?Aβ>C'∂!αβπ33␈;MβSF)↓βW≡+IβSxh+↔c∞k';∃π##∃↓π3π3W/→β?→π3πK'∞∪3↔Mαβ↔≠␈∪∃βSF)β'v#';∨~↓βπK*βK↔O&{K↔⊃bβ'9↓εC?C∃ε{_4+6K;∪'v9βS#*β∂πW≡)β?→π##∃β/∪K?Ir↓α'9αA+KO/!βQ%εk?∪∃ε βK.-β3}{Aβ'~↓β↔;&+K↔⊃bβWPhS'9↓BSKO↔"β;'1J↓β7?&)βS#*βWO↔∩↓β';&+KKWπ!β'MεK∨;?⊗+⊃9↓∧K→↓β&C∃β↔↔∪?IβO→↓β∨}K;≥β&x4+K/#WK9π#=β¬ε∪K↔πZβ?Iβ∞qβ↔K↔≠↔Q1ε;⊃↓W∪O↔QεKMβ;}q7;'baβS#*β↔KK≡+Q↓β/≠↔IβNsS↔K↔+CP4VKM↓β≡K∨;πfc↔⊃9α↓αS#*↓β';O#'π1αβ↔;[O∪?;7.sQ↓β≡{;SπNsM↓β
↓β;Wfa↓β#∞s∪3↔∩↓β≠?∩βS#'_h+';&+KKWπ!1β/!βS#*βWO↔∩β7πeπ≠WCCgIβ¬β↔∪↔π-εc??Aε{Iβ?&C↔IβF;∪3/⊃84(hQ↓↓α≡{KK↔∨#π3*β↔KK␈∪Mβπ⊗)↓β↔↔∪?KMπ;#'∂Bβ7πeαβ∃β≡{KK↔∨#↔⊃β↔I↓βW≡+Aβ'w#↔K[.sS'?rp4*'2βOW∂Bβπ9β/∪K?IεKMβC⊗{C↔KgI↓β∂␈∪K↔∂&+⊃1β/3π3W∂#'?9π;'31πβK?∂.+⊃βπ~β'→↓εs=β↔↔∪?H4VCπ⊃β}≠∂WK⊗+⊃9↓∧K→βSF)β?C&K?9β&yβ∂?↔∪↔∂Qπ##∃β/∪K?IεKMβ;␈!β↔c/∪∂'O.!1βSFKMβSOβ∃β?0h+↔K⊗{Iβ←Nc1β*β#π;&c↔⊃β∂→β'→εKQβ←/∪∃βπrβW;∂␈∪K↔∂&3∃ε+CK?∩p4(4R↓↓α←F+9β¬ε≠?KK.≠Sπf)β↔K⊗{Iβ?≡≠WKMbβ¬βW≡+Aβ'w#↔KK/βQβ'~βO'∨v33↔ q↓αO,)↓βC∞;∃↓Mhh)EEαβ≠?IαβWO↔∩↓β';&+KKWπ!↓β∂F;;↔bβπOON;;7↔w#M↓β6{A↓β&C↔O∃αβ↔KK␈∪M9↓e error and then enter a break
doop.
The argument passed to the user interruPt handler is an S-expression
describing the epror. SeE sec@QS←\@bTh\HAM←d↓IKiC%Yf\@A∪LAQQJ@AUgKdA%]iKeIkah~)QC]I1Kd@A%bA]S0X@A←H@ASL↓Sh@AIKike9f@AB↓]←\[1SghXAiQJAKee=dASfAieK¬iKH@↓CfAC8~∃k]
←eeK
iCEY∀AKee=d\@A kh@A%H βSF)β#πv#3↔I¬∪↔SW⊗sM↓β
β3'O"aβS#*β∪'K≥!↓β↔d+7↔;"β?_4W##πQ∧c'OQεKEβW≡+⊃βSzβ∂?K⊗+∂Qβ&C∃β↔↔∪?IβLqβ¬β>eβ←FK∂!β&+C↔;'→β?9αβS#∃πβπKSN≠W3π⊂h+↔K⊗{Iβ←FK∂!β}≠∂WK⊗+⊃84Ph)↓↓∧K→βSF)β7∨≥!βK↔≡+;Qβ/∪K/In≠πS∂F+Iβ'~β;?Qπ#?A↔d+[↔1bβ∂?K⊗+∂Sπ⊗c∃β↔↔∪?KMπ;'31ε∪∀4+'∪↔πS.!↓βπ~βW;∂␈∪K↔∂&#∃αβ↔KK␈∪EβWvc↔OMαβS#↔⊗)β'Mαβ¬β;}q7;Wda↓β#∞s∪3↔∩↓β≠?∩βS#∀hS↔KK≤+Qβ'w#↔KK-βQ9↓¬##'MεKE↓β&yβCK/3↔;Q∧∧6}vn↑6Nvt∧&o.NM↔εg∀ f/∨L\B∩α↑'ε←$'⊗.≥>0hW]mF/∨4∞FF*∞↑6/∩
→f&N<≡F/~∞Mε∂"
Rαε≡4π≡␈
↔∂&≤<↔&.Dλ'Jπ<ZG&Nlpλ∞↑λ_ ∧
_;Y
L<H⊃M}A"U
(→0→≤αsetinterpqpt. (The e@I`O↔"β#π;&c↔IβM#@≡.LdαεO4
vvg∀ ⊗w6⎇<V"ε≤dααW,8W"ε≤1PVV⎇eVvNEDεF␈|↑f/∩e⊃PPH$∧α¬≡\Tπ&FTλg.v>M⊗}w4λW.[xC∧<\@⊗λ0s2 errc@∃h\
∀4∀∩∀b8h\d@↓+gKd↓∪]iKI`GC'_4(Q!PRα∧ DM≥∧∞πε␈m_F/~⊂εw.\,Wαε|dα↔<y4D
;]→.∞]<≥∞∃α⊃⊂;Z4qt⊂_y2P0H6rq`(anisM by Which a
u@MKd@AAeWGKα#WK∃αβ7πeαβS↔7ε{@⊗∂-→GJε|≥⊗rα9vw'-yBαπ⎇Vrα≥bαε←6/πM≥vv∞Dλλm⎇Y~5
≥{C"AQ@εE(_qrP→KX[⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∧YVXG
↔_P⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂"2Xrrq2\⊂≠⊗⊂\[[FBβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ*42P∀|yz2[P⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*∃
εEεEβE40x≤2w9Wλ⊂*42H2|1r\:4ww_v⊂1w[24z4[w9P:~0z⊂:\rP:4→P:yr\⊂4w:→y9:x≥⊂⊂9|\z2vP~w1v:Y2FE1Yy:0t[⊂1ww≥97v⊂_t0y0Xz2y9K⊂:42H0v0y≠qv7qZP:4vYy9V⊂_y|w1Z97w7]yP⊂$KgP1w[24z4[w9VεB:42Pλ3py1_srP⊂_wv62Xz7y⊗λ⊂0w2λ⊂6pw≡P⊂7sλ:42Pλ2y97\9P⊂:~0z⊂⊂_y2P⊂→2z2q]2r⊂⊂_<P:4→FE4w≥2y89→z2y⊂≠y⊂1<H:42P≤|yz2[P⊂3:[1z4w[9W⊂⊂⊃y97y≤P22z→qz2rλ1<P:\ry⊂⊂→:w1z~ww9P_pwεE≥yrP:~4yP6Yqt0w~yvP0[9wWεBεE⊂⊂λ*42P≥yry⊂~w:2y≤:x:9H0y2P→4{4b→r⊂⊂:\⊂4w:≠P9r{→y0v⊂_t0w7→v9W⊂λ"pqtλ⊂1t0[72v⊂~0yFE_yywqZpz2rλ⊂;tz~⊂⊂4zλ⊂0P⊂≤ry;4XrP3:[1z4w[↔⊂⊂⊂∩q⊂⊂:~2P⊂9Yy;4qYP⊂3:[1z4w[⊂⊂4yH74v⊗βE4w:→y9:x≥9P7wλ:40zλ1t0w≠2v⊂+Zv6⊂1→P4sw≠y2rπλ⊂$s⊂≥42P9Yy;4aYP3:w_z4wwλ4yP7≠z⊂74[⊗εE4]⊂⊂4yH0P⊂3≥w1z4[w⊂;t~qt⊂⊂~yP1p[62rλ;tz4λ7w2Pλ0y3z[rs:⊂≥t2w⊂λ:42P≥yry⊗Zw:2y≤:x:εB7qqz\9W⊂⊂λ∀ P⊂→2{P$[:2y9≥x:⊂⊂~0w26→y9P⊂≥0urPλ6wy2H:40wλ⊂7w2H⊂0y3]vrw:⊂⊂⊂)YrP:4→FE9h→qts4XP22yXy4x:~ww9W
P*42H70z:\2P7sλ:42P_y3zvYw:⊂"→x2w2≤P7w⊂≥t4qtλ⊂1t0[72v⊂≥42FE~w:2y≤:x:⊂~yP7w∞P:yzXv6<P~z⊂4yH0w⊂)Kr|89→yytw[⊂;t4Xt⊂1p[⊂12P≥yrr⊂≥7P67Xpv4⎇→P:42CE1pz\rP7sλ⊂:42H4w:2\9:x:⊂⊂⊂)[vrP:\ry⊂4[:2y9≥x:9Pλ:yrP≥42P⊂≥0v:rH92z:\72r⊂λ1<P:~2FE9Yy;4qYP3:w_z4wwλ:7P2→qtr2H;t0zλ:7P2≠P0q7]z⊂:4→P1pz\rP7sλ:42P~w:2y≤:x:↔βEεE⊂λ⊂$w:→y9:x≥9P⊂1Xw⊂⊂1→P2tz~2y⊂⊂≤|w1t≤7w7z\P⊂∀2K3W⊂2\97y9H⊂0w2λ⊂3py_0srP_wv62Xz7yεB4w:2\9:x:≤TP7yλ0y|w_t97w≠zyP∀_ww:9≠v⊂1t_y0qz→y9V⊂_v0y6Xv7quK⊂2z1K∀W⊂⊂λ*7P8≤2{2w≥εE:4[tw3P→y97y≤V⊂0y↑w1t9≠w7zyH4w:2\9:x:≤P⊂0y→P0v;X|yP9≥w⊂4wλ∀77t[:2y9≥x:⊂⊂≥∀P6wY2WεE⊂P40w→62y⊂→7y⊂0[⊂0y|[1t97[7zyP~w:2y≤:x:⊂≠zyz⊂→|864Xtz6<H27P∀≠7tw:→y9:x≥⊂⊂74[∀P:7CE82y≠tz⊂7]42y⊂λ0y|w_t97w≠zyP2\97y9H⊂:7P~w:2y≤:x:⊂~z↔⊂⊂λ∀#7yλ2|0v\62V⊂λ:42P≤|yz2[VFE9]x864Yr⊂/1λ40w2≠2y⊂2≠ryP:~4yP⊂≤wP:4_z⊂1w[:97vλ1t0y_qz2yλ4w:2\9:x:≤P1pwλ⊂12P≥yrrεB;tz4~w⊂:4→P/1⊂_92puH67wx∀FEεB⊂⊂⊂*~2P9r\;4qrH⊂3:w_z4ww≤P37yλ⊂6wy]⊂:yr\⊂4w:→y9:x≥9P⊂0\2P5r\:⊂⊂0\P:42H⊂;0v≥ryP7YεE9|[q7v9H⊂;tz~⊂6w2[ww4qH⊂70vYyW⊂⊂⊂P⊂64\z⊂7sλ⊂:42\rP9|[q7v9H⊂12sZw9P7[⊂⊂80YrP→VL\WεE∃42y2H0y2P_v9wPλ:yryλ4w:2\9:x:≤P37yλ⊂1ww≥97v⊂_t0y0Xz2y9K⊂⊂*4→P⊂9r\;4qrH3:w1]4ww9CE37yλ:42yYP0y2H22qv_y2r⊂≥ytw3H∀9yz_z:yP≥:<tw≥∀W⊂⊂∀rrP8_srP→K\_↔εBεE⊂⊂λ*42P~w4z4Xv⊂;0[:ryPλ37y⊂≥42P9Yy;4qYP3:w_z4ww≤P⊂7sλ:42P≥0y4w]yP⊂4[:2y9≥x:9P_y2FE≤97{4Y2r⊂1≡P:42H⊂9|y]2vP0\P192XuP⊂6≠wx9P→7y⊂9[vrP⊂~w:2y≤:x:9H0w2⊂≠4v⊂⊂→7y⊂7]42y9CE∀2|_rx:⊂→7y⊂9[vrP1[w:97[⊂1t0\0qz2\9TWεBεE⊂⊂λ*42y→P⊂0y→P⊂9w[rP⊂9\2qtp[⊂1ww≤tr2y_z4ww≤P⊂37\⊂⊂:yYy⊂⊂4[:2y9≥x:9Pλ9tsw_v62rλ1<FE_wy92Xz0q6→P⊂2y≤7y⊂⊂_ww24]4ww9K⊂⊂⊂*~2P⊂0\3zvr[:⊂:7H⊂:42H⊂9ry≥4qrPλ3:w1]4ww⊂λ4yP0CE22yXy4x:~ww⊂7Y⊂:42H2y97\⊂;t7\rP2|_qz⊂⊂→7y6P~yP22\qy4q→r⊂4wλ:42P_pz0v≠szrPλ0z⊂:~2FE2[2⊂7sλ:44yH9rqz~ww↔⊂λ$s⊂:~2P⊂9Yy;4qYP3:w_z4wwλ92z:\79P7~v⊂∀7\⊂0w<H⊂7z4→y⊂0z≠vTVεB:42P≠7y6p[⊂2y9≠y⊂89≠qrr:\2P7qXzy9PVP1w[:97vλ92z:\79P:≠P:42H6syzλ⊂92qYw:⊂"\99rjεE7yλ:7P:≠x⊂62]2v⊂$Yα there was no errcEt. If the service function retpe]LABAY%chX~)iQJA→Segh↓KYK[∃]hA←_AiQJ↓YSghASfAUgKHAQ↑ACIQK[ah↓aKG←YKerA→aP∨5π##∃↓ε+CK?⊂q↓αSF(4+↔F∂Q↓π;πeβ&CπQ↓εKQ↓βM→βGO,∧Bαε≡4ε&/<8M≤Y9∧
9Hλ∞M→(_l≡_;∪l@zrWλ⊂$s⊂λ92qg]2y<P~yFE)]qqr`3qful exeCution proCeads froM the poiNt where The Ep¬eODAWGGβ+CK↔ ¬bα∧≤aPG⊗\8nl<Z(
≡h≥3N≡8xp∩\βsfu@0ACM←β##↔I∧∧W.Yx is sIdπ]CY1K@L~(~∃ K
K[EKβ⊃↓Y1β eM]α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓≠→5E9αEc∩α∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧αααλλ⊗.
∧5S8Q bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧ V∞≡M~7α¬,Xf/⊗]l6*∧β8;N\9λλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ¬∃"∀ c***
Here is an example of aAcgKβ⊃β';&+CKW¬!βO↔↔3'∂∃αβ∪G≠≤εFN}e`α¬&
≡2εO4∧π&FT
vv(Q(n↑≤≠∩,\λλ_O∀≥~→$∧≤}<nL;(→M}Hλ≥-l[x
g→⊂⊂;0\4pq6→P2y9≠y9P⊂≥t2w≥42P⊂≥yryλ27ryH77zεB9x2qZs<P'[2W⊂⊂∪4πte thatthe system-supplied error service functions consiStently
bind args to the abgument supplied. The user can check the value of this
variable to see what is wrong. Note too that the system-supplied error handlers
restore readtable and obarray before breaking.
(defun +internal-ubv-break (args)
(declare (special args))
(errprint nil Msgfiles) ;print error message
((lambda (readtable obarray)
(nointerrupt nil)
(break unbnd-vrbl))
(get 'readtable 'abray)
(get 'obarray 'array)))
(setq ufbnd-vrbl '+internal-ubv-break)
Alarmclkck SUBR 2 args
¬
alarmclock is a function fo@HAG←]QeP∨3dK;≥β&K7/,5bα∧≡@ε≡∞d∞7&∂.@αε∞l@π∂&}↓PRα∧∧απ'⎇tπ≡∂≡&∂&T∧π&N\Z'Z
⎇f*α
≡2ε
∧∞&.∞E↑FNnT∞FNn↑$ααG⎇
⊗≡B=w.wN4απ≡\9vv'4
v h$∧ααα]F∂π<\Bπ&≥\RJε≥lBπ&Tε␈&↑"εO4∩ε∨∞UW&N\Tπ&N\Z"αG⎇
⊗≡B∧6␈.nN2εn≤>&␈≡\9vv'1Q"αα∧∧ε}2
\⊗≡F≥lRαπ.]bπ&≥\RJR∧∧¬&FTfO↔>Dε∂⊗}YV.w being referred to: it may be the atom time to indicate the real-
time timer or the atom runtime to indicate the cpu-time timer.
The second argument to alarmclock controls what is done to the selected
timer. If it is a non-negative number (fixnum or flonum) the timer is
started. Thus if n is a positive fixnum or flonum, evaluating (alarmclock
'time n) sets the real-time timer to go off in n seconds, and (alarmclock
'runtime n) sets the cpu-time timer to go off in n microseconds. If the
timer was already running the old setting is lost. Thus at any given time
each timer can only be running for one alarm, but the two timers can run
simultaneously.
If the second argument to alarmclock is not a positive number, the timer
is shut off, so (alarmclock x nil) or (alarmclock x -1) shuts off the x
timer.
alarmclock returns t if it starts a timer, nil if it shuts it off.
Page 3-18 ∪3-1.4.2 December 6, 1977
**DRAFT** The System **DRAFT**
When a timer goes off, the alarmclock user interrupt occurs. The
service function is run in (nointerrupt t) mode so that it will not be
interrupted while it is performing its service. If it wants to allow
interrupts, other timers, etc. it can evaluate (nointerrupt nil). In any
case the status of the nointerrupt flag will be restored when the service
function returns. The argument passed to the user interrupt service
function is the atom time or the atom runtime, depending on which timer
went off. See also the function nointerrupt.
nointerrupt SUBR 1 arg
(nointerrupt t) shuts off LISP interrupts. This prevents alarmclock
timers from going off and prevents the use of control characters such as
CTRL/g and CTRL/b. Any of these interrupts that occur are simply saved.
(nointerrupt t) mode is used to protect critical code in large subsystems
written in LISP. A similar deferral technique is used by the LISP system
itself to protect against interrupts in the garbage collector.
(nointerrupt 'tty) prevents control characters (typed on the terminal,
or "tty") from causing interrupts; however, alarmclock interrupts (and
other asYnchronous interrupts) are still allowed8@Aβ]dA]←\5iibA¬gs]G!e←]←Uf~∀@@@AS9iKeeUaifA]QSGP↓oKeJ↓gCmK⊂AoSY0A]←n↓O↑A←→L\~∀4∀@@@@@@@!]←S]QKeekAhA]S0RAikI]fAS9iKeeUaif@↓ECGV↓←\\@↓β]rA%]iKeIkaifAoQS
PAoKIJ~∀@@@Ag¬mKHA]SYXA9←nAO∃hAae=GCgg∃H\@AQQSfA%bAiQ∀A]Oe5CXXA%]SiS¬XAgi¬iJ\~(~∀@@@@@@↓)QJAIKgkYPAeKiUe]KH↓Ie←Z↓]←S]QKeekAhASf↓iQJAAeKmS=kfAS9iKeeUah@AMiCikL@Z~∀@@@A9SXXAPXA←d↓iab\4∀~∧@@@@@AqC5aYJ@Ph(4 α↓↓↓↓α↓↓↓↓αA##πn∪∪¬↓F{3∪O&SWMHh)↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓sC⊗{S↔∂&+⊃β∂|∧F+pQ$ααα∧∧ααα∧∧ααα∧∧ααα∧¬εv}≥nF/↔,X∞D≠{→∞>_=≥.5*#"D∧λλλ∧∧λλλ∧∧
≠[m≥]→<N.<≥λ∞E*#"AQC"C!&+MF4λ⊂x.L9≠yn\(≠qD
<y0→λ$w:2\9:x:λ!t0w≠2v9FBεEεEβEεE"→qrvq→y⊂≠⊗λ_\[[H⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∧YVXW
↔→⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∀0srPVX\FBβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂&Xqv4y\⊂)2s→y2w1YP"pw≥pv⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c***
Each useR interrupt channeL (eXcept qome assOciated with files) has a
Varaable whose value is a functional form, the service function forthat
channel. The name of the interrupt channel is the same as the name of the
vAriable. The dollowing lists the usep interrupt channelq in al`habetical
order. The argument to which the service funcTion iq applied and the value
which it should return are described. By convention, almost all sarvice
functions receive one argument. Some user interrupts are initially sat tk a
system-supplied handler whiCh binds the var`∪C YJ@A¬eOfAQ↑@Ai!Sf@A¬eOk[∃]hAC9H~∃K9iKef↓BAEe∃CVAY=←`\@↓)QJA9C[JA=H βSF)β';&+KKWπ!β'Mπ+Oπ⊃εEβSF)βK.%β'&+;S'6+@∩pQ!PRα∧
6}nT∞W≡∂$ ⊗w&↑.'/πN4εN>mz&*πMRπ6≥NV*π,ZG/⊗lX ∧↑(∃
(≤y.∞X∧q`% function whiLe
oThers distinguiSh two cacEs* Id the value is atomic, the seRvice functionwas
not @¬EYJ@↓iP≥β⊗+∂?[/⊃β≠K}i↓βSF)β∂?v#'S'}qβS#∂!↓β∂∂+G↔⊃π##∃βL¬g&/,.Wπαd∧α∧d~:απ>≥M@hWL≥6*ε≡N2ε&\hλ.]≥λλ≤⎇~;meλ≤⎇,=λ_<d∞Y=≥.-X∧w3H⊂1w`.trol th∞Ai!JA[←β≠Q↓β⊗+∂↔;"β↔KK≤∧W"pQ)⊗"α∞Mε*πl≥G.(λ∩.P0P⊂≠4yzελ:42Pλ1pq≠q⊂⊂:~0z⊂&~yz⊂⊂~yP:yYr⊂⊂:≠P92a[{2yλ397vH:42FB1ww2~z4wwλ:40zλ1priYr⊂:4→P⊂4w≥2y9:\:∪⊂⊂∩z⊂4yH:yzp[48 A new piece of data to Be
uSed iN place of the one that was being compl@¬S]KHACE←UhXA←HABA]∃nAM←IZ@Ai<AEJ~)KmCYUCiKH↓S\Aa1CGJA=HAiQ∀AM←e4AiQCPAKee∃H\~∀4∀@@A%LAiQ∀AmCYUJA←L↓iQJAMKemS
J[Mk9GiS←8AmCe%CEYJ↓SfA]%XAS]MiKCH↓←L@A∧AMk]
iS←]¬X~¬M=aZXAQQJAkMKdAS9iKeeUahASLAG←]MSIKe∃HAi↑↓EJAiUe]KH↓←ML\A)QJ↓gsgi∃Z@AE∃QCmKLACf~)SLAi!JAMk9GiS←8AQCH↓ek\A¬]HAe∃ice]∃HA]S0\~∀~(@@A'=[J@AUgKd@↓S]iKIekaiL@ACe∀@ACge]GQe=]←kfAS\@↓]CikIJX@A¬]H@A¬eJ@A∃qKGkQKHAS8~∀Q]=S]iKIekah↓hRA[=IJAi<AaeKYK]hAQS[S]≤AKee=ef\@↓)QJA%]iKeIkahA!C]IY∃`A[CdAGQ←=gJ~∃Q↑Aek8AS\@!]←S]QKeekAhA]S0RA[←⊃JXAQ=oKmKHXACf↓iQJA%]SiS¬XA=D↓QC]I1Kd@A⊃←Kf\A)QJ4∃]←S9iKeeUahA[=IJ@A%fAeKMi←eK⊂@ACMQKdAi!J@AQ¬]IYKHASf@↓ek\\A'kG @AS]QKeekAifACIJ~∃i!K[gK1mKfA⊃KMKeIKHAEd@Q]←%]iKeIkahAPRA[←⊃J\~∀4∃C@3∂∪7∂3}≠ ~α∧∧ααα∧∧α¬4~)∀∀HQPPh*Mε*πl≥G.
xbε∞L≡&n≡M|6@4~<h∞M→(≤l↑]Z0lT→];L>~;sD[|@∞M→(≥.<<H∩-n→<\N↑≥λ∀m≤{X;
L9β"N⎇→;@∀≥~;,↑H≤y.Dλ≥<∧↑(∃
(_;≡[8s
|zh→N]X⎇~-⎇Hλ→m|<h≠l@3↔⊂⊂∃42P0\3zvr[:⊂⊂4\β the
fame of the timer which went @=ILX@↓iS[J↓←d@AIk]iS5J\@AQQJ@AIKike9KH@AYCYkJ↓Sf~∃%O]←e∃H\@@↓)QJ@↓gCem%GJAMU]GiS=\@ASL@AKq∃GkiK⊂AS\@QU←S9iKeeUah@APR@A[=IJ\@↓)QSf4∃S]i∃eekaPASfA%]SiS¬YYbAQke]K⊂A←ML8~∀
∀4∃Cki=YWCH@@@@@@@@A-β%%β¬→
4∀~¬)!J@Am¬YkJA=H@ACUi←Y←¬HASfAiQJ↓gKem%GJ@A→k]Gi%←\AM=`@Ai!JAkg∃`@AS9iKeeUahAo!SGP~)ae←m%IKf@↓Cki←5CiSFAY←C into the environment. The
Page 3-20 ∪3-1.4.3 December 6, 1977
**DRAFT** The System **DRAFT**
argument is (function-name . autoload-property). The returned value is ignored.
See page 3-26 for details. This interrupt is initially set to a function which
simply loads a file.
cli-message VARIABLE
The value od cli-message service handler for the user interrupt signalled when
another job has interrupted the LISP job via the CLI device. The argument is
nil and the returned value is ignored. A usep handler is expected to open a
file on the CLA device and read the message from the other job. The service
function is run in (nointerrupt t) Mode. This interrupt is iniTially turned
off. Currently, it exists only in the ITS NeWio implementation.
errset VARIABLE
The value of errset is the service function for the usep interrupt which iq
signalled when an error is caught by an errset and *rset is non-nil. The
argument is nil and the returfed value iS ignored. This usep interrupt is
initially off. Turning it on affects the behavior of the error system (see page
3-16).
fail-act VARIABLE
The value of fail-act is the service function for the user interrupt which is
signalled when any of a large variety of miscellaneous error conditions occurs.
The argument is a list whose first element is generally a symbol which describes
the type of error condition. The rest of the list contains various objects
related to the error. The returned value depends on the error. These are not
standardized and will not be described here. This interrupt is initially set to
a break loop.
gc-daemon VARIABLE
The value of gc-daemon is the service function for the user interrupt which is
signalled after each garbage collection. The argument is a list of items; in
the PDP-10 implementation each item is of the form (space-name fpee-before
free-after size-before size-after) and in the Multics implementation, each item
Iq of the fkrm (space-name fRee-befkre . free-after). The returned value is
ignored. This inteprupt is initiallq TurfeD off.
¬
December &, 1977 ∪3-1∞4.3 Page 3-21
**DRAFT** MacliSp Reference Eanual "*DRAFT(T~∀~(~∃OF5Y←gg¬OB@@@@@@@A-βI∪β¬→∀~∀
∃QQJAm¬YcJA=HAOF5Y←gg¬OBASLAiQJ↓gKeM%GJAMU]GiS=\AM←HAiQJ↓kgKd↓S]iKIekahAoQS
PASf4∃gSO9CYYK⊂AoQK8AiQKIJASf↓]↑A[=eJACYCS@3∞∪3∃β∞#∪K↔∨→βOC∞≠∃β?∩β←#↔pβS#∃¬#'7∃¬≠#πKNs≤4*n{;'S␈⊃βK↔T+∂SMε βK↔∂+↔OQ∧3?Iβn{K∃βn+7?KJq↓α'rβS#∃∧kW3SN≠@~ε≥↑εf.\]g&∂M≥vrb∞Mε/⊗QQ&O~≥G>∂≡4αε.mx
,⎇λ≠9-]|↑+∧∞{hλ∞M~<h∞↑y<@
≥]→<N∞<≥λ∧
Y=Y.⊂7qq]y9W⊂λ$w⊂⊂≥42P(⊃(∩XXβE0vx≠2vrg≥0z4w[⊂:42H0y3z[rs:⊂~yP:4→P70vYP7s⊂≥42P9\0qrP≥40z lkst, and the returned
Value is iGnored. This interrupt iS iniTially set tk abreak loop.
gc-overflkw VARIABLE
¬
The valqe od∧AOF5←mKe→YWnA%bAiQ∀AgKeYSGJA→k]Gi%←\AM=` βSF)βWO-⊃β';&+KKWπ!β←#L≠!β'_h+O'>sπ33.!β←#.qβ¬β∨βπ∂∃ε{[↔K6c?←MεKSMβ>≠7πar↓↓#O.)βπ3f{
βπv!↓#O&SWMε;∂7πBI9%α&C∀4+∂∪∨W7,sQ↓βO→↓βSF)β;πn)↓β?2↓βS#*βOCπ≡)1↓↓¬##∃↓π∪↔SW⊗s↔⊃β63W∃αβ'M↓εK↔;?⊗+⊃9↓¬##'LhS';S/∪KWC"β'MβNs'S'∞c3eβ≡+QβSzβ¬β⊗+π-βf{?A8hP4(4VK=73␈≠Oπ∨*↓↓↓↓α↓↓↓↓¬2εJ&∩2∀4Ph*S#*β[π3.)β?→εK=73␈≠Oπ∨*β'Mβ&C∃βO/∪['∂*β≠W;∨#'?9ε3?Iβ&C∃βW≡+Iβ'w#↔KK/βQ↓β>C'∂!εKL4+≡K∨;πfc↔⊃β>C↔9β&C∃α%|yβOg∨#↔5β.s∂?Ww#↔KMε9β↔↔∪?I↓F3?Iβ/Cπ7Cf)1β¬ε3'3∃π;#'∂Bβ←πLhS↔'v9β?C.s↔⊃β>Mβ;␈!β≠?.s⊃%9ααS#∃εK∨Wn+;QβO→β¬βfKOQβ}1βS#*β;π7*β?→β&C∃β≠.s∂S'}p4+←FK∂!β/∪K↔⊃αβπ;⊃εKSMβ∂∪∨W7.sSM1αβ←#'≡Aβ7πJβ#π[*↓β↔.qβOS∞s∪πK&Kk↔⊃αβ?Iβ␈##↔K>KO∀4WβπKSN33eε#'∨↔∨#↔⊃9ααS#∃π∪↔SW⊗s↔⊃β63W∃εKMβ¬εc'OQε{→β¬εs↔]β6{K5β&y↓β*β↔[πg+πS↔ h+'9πβ3π∂*β?→β&C∃β∂∞c1βSz↓βS#*β≠W;∨#'?9π;#'∂Bβ↔KK.!9↓α&C'MβNsS↔K↔+CQ↓εKMβ'vKS'πfcd4+≡+QβSzβ¬β⊗+π-βf{?A8hP4(4Vkπ∂#Ns∃7↔↔∪?I↓α↓↓↓↓¬2εJ&∩2∀4Ph*S#*↓β[πg+∃↓β}1β7π≡C';∃n+KK?∩↓β'MαβS#∃αβO↔K6K∂∃βF;∪3/⊃↓β≠␈⊃↓βSF)↓βW≡+Iβ'w#↔KK/βP4+≡K∨;πfc↔⊃β>C↔9β≡{7∃β&K≠≠'∨+3SeεKMβ↔Gβ↔K'.s∂↔⊃ε∪eβSF)β#?∨!β7π≡C';∃r↓↓αSF)βO↔↔3'∂∀hS≠W;∨#'?9π∪↔∂↔O3↔Mβ6{WIβ∂∪∨W7.sSMβNsOS↔∞!β?→ε{;∃9ααS#∃ε3'KO"β'Mβ∞q↓βπ&{7'
π≠g7}`4+'v#'∂π&K;≥β&C∃βSOβ∃β?2β↔KK␈⊃h4(hQ↓↓β/3π1↓α↓↓↓↓α↓↓↓↓αβ'33.;π1βn∂#'v)β?C/∪πS'}p4)↓αβ↔cπnK;∃↓α↓↓↓↓α↓↓βπ'#↔7C"βS=β⊗+≠↔K.s∂∃βv{97↔FKOS↔w!β7↔n{Kd4R↓↓β∪/β?O'"↓↓↓↓α↓↓↓↓εSS↔oβQβSzβ←K'&)β';&yβK↔∞!7?;gIβ7↔n{Kd4R↓↓β?A↓↓α↓↓↓↓α↓↓↓↓πβπK''Iβ↔K⊗{H4*&C∃β?&C↔Iβ&CK↔∃εK∨Wn+;SMεK∃↓ε3'c;.kMβ←FK∂!β∂∪∃βπK↔O≡+Mβ?2↓β7↔n{Keβf{∂πSN{;M8hRS#∃π≠↔∂?v!β'Mπ##∃βf{∂πSN{9β?2↓βS#*β↔KK␈⊃mβSF)βS#O∪⊃β'~βS#∃πβK?∨⊗5↓β≡{W;S/⊃β←#.p4(4Ph*Cπ>)↓M5∪⊃↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓M~iE9Qs→↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αα∪↔∂.k↔Iβ11↓EK9\4(1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓αS#*αOgO&+5↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~"Q(4(hP4+SF)β↔K⊗{Iβ?≡≠WKK.!m↓β∞s⊃βSF)β≠?/∪S!↓εKMβSF)α*B~↓#S#*↓βCK};Kπ5ε≠?W;&+Iβπ~↓β?→π##∀4VcπOQεSW7AεK;OS↔+∂S'}qβ↔6{K∃β&C∃β↔↔∪?Iβ}≠∂WK⊗+⊃%9ααS#∃εkπ∂#Ns∃7↔↔∪?IβF;∪3/⊃β7πHh+O'>sπ1β
β∪'≠6+K↔;"β/';"β?→β/∪K?Iε{I⬬s≥βG.KQ↓#≡+∃βSF)α{≥ε3W;∂&K?9%αβ'→β&+O'K.!04+␈⊃β↔;&+I↓β
βK↔∞Yβ3?␈↓9↓↓¬##∃β∨+Iβ7+;∂SN{9↓↓G≠↔∃βε∨∃↓~iEAMJ↓β7πJβ∃↓π+O↔≠.aβ'8hS∪↔∂}#';≥αβS#∃π##K↔*↓β≠'FsW5β∂∪∨W7.sSM9α↓α'→π##∃↓εCπ;∪f+IβK/#WK;~a↓βSF)↓β[∞cW∃βO_4+'>s?K↔"↓βπ;"↓βS#*β↔KK}s↔?W~↓β?C/∪πS'}q↓β'~↓βK↔'∪'↔⊃r↓α'→αβS#∃αβWO↔∩↓βCK␈3'∪↔~β;<4Vkπ∂#Ns∃7↔↔∪?I↓εCπ;∪f+I↓#&C∃↓βNsS↔K↔+CQβO→↓β'vKS'πfceβS/∪;↔⊃αβ?≠→JaβS#*↓β↔K⊗{Iβ'led in the default manner for the host machine. On ITS, this puts the user
in DDT. This currently exists only in the PDP-10 Newio implementation.
Example:
(defun machine-error-handler (type loc pc jpc)
((lambda (args terpri)
(declare (special args terpri))
(terpri msgfiles)
(cond ((eq type 'examine)
(princ '|;REFERENCE TO NON-EXISTENT
MEMORY| msgfiles))
((eq type 'deposit)
(princ '|;WRITE INTO READ-ONLY MEMORY|
msgfiles))
((eq type 'eval)
(princ '|;ILLEGAL MACHINE OPERATION|
msgfiles))
((eq Type 'odd`)
(princ '|;MEMORY PARITY ERRLπ%x~(@@@@@@@@@@@@@@@@@@@@@@@@@@A[MOMCY∃bRR~(@@@@@@@@@@@@@@@@@@@@Q`⊃↓GβK';~↓∨qn,r.:><qα6ε≤B&:∃∧*JJ>↔`4)↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓β7≡;≠'3/→%%$hQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αCCKπv→↓∨Q∧2J>5∧b6∞ε$J0≤@H∨λ
↑yyZ-L<j#!∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ¬∞≤Z3L4≤_j!QHλλ∧∧λλλ∧∧λλλ∧∧λλλ∧¬≤≤Z-lh ␈∧ 3H⊃JYβ!`∀ILπ⊂→βbβ7O∨4¬⊗f/5⊃PBα∧∧ααα∧∧ααα∧∧ααα∧∧αGπ-→c
αα≤u,.H≤⊂e∃ εE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀1≤2pu@≠pqt4[2Vri≤αh∂dR$~∀@@@@@@@@@Q1SghAβ#gC∃∧¬F}~∞λλd
\_j!QHλλ∧∧λλλ∧∧λ≥∀JFAεEβE0
ar-breAhε@@@@@@@@A-βI∪β¬→∀~∀4U##∃β43@.Tλl@⊂6pyq92`Zβ ic phe q`e@4¬⊗≡(~_-l≠→0→λ30∂r↓iQJAβ+G/$∧εNwLXN8¬pt↓`∂'∨v3 &\AP@.z→0↔λ842Pλ4rvw\αy l@=GCiSα{9βO∧∧V≡Nm_ ,Dλ_↑$¬≤|p~_z:yP≠py∀Pλ∀9r`% page 3 ~@K9%↓βFEβ,∧Vph!Q hTLXλl]8Y0→λ≠⊗⊂_NY[P⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂ YKXW∩↔P⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂( YpP⊃VL→FEβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂&Xqv4y\⊂)2s→y2w1YP&pw≥pv⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*¬
εEεEβE0qqYyyrrλ4w⊂:~2P9x→qts4Yr⊂6p[72y↔λ⊂*42H0y3z[rs:⊂~yP74[⊂0w2λ:42P≤2z:i≠2r⊂;_v:rP~yFE4Yw7y2Y↔⊂⊂⊂∃42P9Yy;4qYP⊂3:[1z4w[⊂4yPλ9:w~w⊂⊂∀≠7tw:→y9:x≥⊂:∀Pλ6wr2K⊂⊂⊂ [9wV⊂∪$ihεB4vx6~qtz6≡P82y→7y6yH∀9yz_z:yP≠py⊂_λ74v∀H12s7\2P9:[74w3H:42P≥yry⊂λ4w:2\9:x:∞P:44\FE42[89P:≠P892]2w:⊂λ4w3$[4z2P≠7wx9K⊂⊂*4~yP4w≥2y9:\:⊂⊂4\P4w4]4pv6≡P::y≠2r⊂⊂≠s3↔⊂λ$zεE_zy92[:6<P→|4yz≤P7w6≡P⊂4wλ:42P∩h)P'→{twPλ4vx6→vrw:_z4ww⊂)rrH80srH→VZ[λ⊂37iλ6wy2CE4w3≠y6pz~ww⊂7[⊂:yt[3P:4~yP4w≥2y9:\:↔εEβEεE8→6⊗w{→y367]P⊂⊂⊂λ⊂⊂⊂+⊂i$`a∪"FEεB*42P≥0v:rH7s⊂8→6⊗w{→y367]P4yPλ:42P≤ry;4XrP3:[1z4w[⊂37yλ:42P≥yry⊂λ4w:2\9:x:λ;t4qZεE4yH9tsw_v62rλ;t2wλ⊂0P(≥yt27]w⊂64\z⊂2|_rrr9H⊂4z9H8266X|↔⊂⊂
9rrP_v67qH⊂0w2λ∀9z0]:yFE≤266p↑∀W∀P∃42P⊂_y3zfYw:⊂$\P⊂:4→P9x0Xrw0vYP⊂7sλ:42Pλ8:yt→7{w⊂≠4yz↔λ⊂⊂*4→P92z≥y72bβE;0v≥pP4iH4sw7\2r↔⊂λ*44yH4w:2\9:x:λ4yP4[4z4p[6<P)Yz⊂:7H0P19→puP6≠wx↔εBεEεE≤|yVr→pz4⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∃ i$`P&"FEβE*42H;0v:YP7s⊂≤|yVr→pz4⊂~yP⊂:~2P9r\94qrH40w2≠2y⊂3≠y⊂:4→P:yr\⊂⊂4w≥2y9:\:⊂9tYw0v6→rεE;Z2w⊂:~2P:4[rVyt_y0w3H⊂9|y]2vP4\P0q7]z⊂⊂:≠P3wP→7{w⊗λ⊂40yH12rgλ92{4]2r⊂⊂→97vP≥40zεB9z0z→V⊂7yλ⊂4yP_2tw3H22q:Ysrrπλ⊂⊂*4→P0y3]vrw:λ⊂4yP≠4v⊂ [2⊂⊂:~2P92]8y72Y⊂⊂;0[:rP4\FE4s[7y2r⊂⊂ Pλ:yryλ40w2≠2y⊂⊂≠p|P;Zyt⊂⊂≥5P2|_vtw2H⊂:42H92yz[:⊂⊂7Y⊂∀9z_z:yPλ4z9TH:7FE→2z2y≠tw2P≥42P9]0z2P≠s⊂:4→P9|y]2vW⊂λ*42P≤ry;4XrP3:[1z4w[⊂4yP≤:w⊂⊂~w⊂∀7≠tw:2\9:x:βE:∀P≠wr2Wλ⊂*44\P4w:→y9:x≥⊂4yP~w4z4Xv6<P≥:y72Y⊂7s3⊂⊂*4~yP1z\92w:≠<P2|~yz9P≠w6<P~wεE:~2P$j∀P'2{ZwP4v\62vr[:0z4[w↔εEβEεE:≥<Vy2]:y7⊂λ⊂⊂⊂⊂λ⊂⊂⊂+⊂i$`a∪"FEεB*42P≥0v:rH7s⊂:≥<Vy2]:y7⊂~yP:4→P9ry≥4qrP~0w26→y⊂37\⊂:42H:yryλ⊂4w:→y9:x≥⊂9ts[0v62YεE;t→w⊂1w[:97vλ7s⊂:~2P:2\6tw0[⊂4yP≤2z:y≠2r⊂:≠P:42H&$ihλ57q⊂_<P4z≤P⊂9z\2y4w\↔⊂⊂*~4yFE_v67{\P&$iT⊂:7P→2z2y≠tw2P≥40z⊂≥42P2~yx60↑P9qy→rw⊂6X|P40]2P12Yw⊂1t_w3rrλ⊂1<P≠z42yβE57q≤W⊂⊂⊂∃42P0\3zvr[:⊂⊂4\P74vλ⊂0w2λ:42Pλ92z:\72r⊂≥0v:rH⊂4yP~sw7y→r↔⊂⊂λ*42P≤ry;4XrFE3≥w1z4[w⊂4yH⊂9:wλ4w⊂∀≠7tw:→y9:x≥⊂⊂:∀H6wr2K⊂⊂*4~yP⊂4[:2y9≥x:⊂4\P⊂4w~z4pv≠<P::\72rεB7s3↔λ⊂*44\P1zy≤2w:6≡P2|4\z9P7[6<P4[⊂:42H$j)P∪2{twH4vx6→vrw:_z4wwεEεEβE:w1≠2⊗{9_6⊂⊂⊂λ⊂⊂⊂⊂λ⊂+ i∩`a&"CEεE*~2P;0[:rP7Y⊂:w1≠2⊗{9_6⊂4yH:42P≤ry;4XrP3:[1z4w[⊂37yλ:42P≥yry⊂~w:2y≤:x:⊂λ;t4qZ⊂4yFB9tsw_v62rλ;t2wλ0w⊂0]:2vx≥⊂⊂4yH6pr2H:7P2]0v:p]2P⊂0[⊂0z7[tqP9↑vq7vλ;t4qZ⊂⊂27YyP77]εE40]2P0P≥0v:rH∀0w⊂≥w17z[2⊂;0\4pq6→W∀P⊂∃42P0\3zvr[:⊂4yH0P64\z⊂7sλ:42Pλ9|vq≠v⊂;t~qtεEβEεE(_srP→KY~⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∧YVXW
↔→P⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂"2Xrvq2\⊂≠⊗⊂\[[FBβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ*42P∀|yz2[P⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*∃
εEεEβE1wz[2⊂77]⊂⊂12H2{0v≥pz2r⊂⊂*4→P⊂92]:y72Y⊂;0v≥rP4yH⊂0P6~yz⊂7Y⊂⊂0P≠2{P9↑vq7vλ⊂:7P_2FE2]0v:p]2r⊂4[⊂4z9H860qYW⊂⊂*~4yP4[:2y9≥x:⊂4\P4w4]4pv6≡P9rzλ:7P0H192pZP67w\↔εEεBεE:w→3⊗s7_z7⊂⊂λ⊂⊂⊂⊂λ⊂⊂+ T$`a&⊃FEεE∃42P;_v:rP≠s⊂:w→3⊗s7_z7⊂4\P:42H9ry;~qrP3≥w1z4[w⊂37\⊂:42H:yryλ4w:2\9:x:λ⊂;t4Xt⊂4yCE9ts[0v62Y⊂;t2[⊂0w⊂_z:2v\:⊂4yH6pr2H:7P0\86<P_w⊂:w→2s4w→r⊂3:[1z4w[↔⊂⊂⊂∃42P0\3zvr[:εE4\P0P6~yz⊂7Y⊂:42H3:w1]4ww0[⊂37y≠P;t4Xt⊂1w]v2⊂7≠z⊂12H0x86~rr↔⊂λ*42P≤2z:y≠2r⊂;_v:rFB4yP⊂_P64y]⊂⊂7sλ0P⊂7→{P⊂3≥w1z4[w0v⊂→7y6Pλ:7P:_urP⊂~z9P8≠0qrWλ⊂⊂*4~yP⊂4[:2y9≥x:⊂4\FE4w~z4pv≠<P9r]⊂:7P_P192XuP67[x↔εEβEεE:[9rrwswVz_sP⊂⊂λ⊂⊂⊂+⊂i$`a∪"FEεB*42P≥0v:rH7s⊂:[9rrwswVz_sP4yH:42P≤ry;4XrP3:[1z4w[⊂37yλ:42P≥yry⊂λ4w:2\9:x:λ;t4qZεE4yH9tsw_v62rλ;t2wλ⊂3wP≠y⊂:4≤7{P4\P⊂:yYr⊂;t]4⊂0P≥0sP⊂≥t4qtλ27ryH77z⊂→|4yzλ⊂4w⊂≥42FE_zy92[:⊂89≠sP17Y<P7yλ4w⊂0[<P1p]1t⊗⊂≤2yx2Xz4{2[<W⊂⊂∃42P0\3zvr[:⊂4yH0P64\z⊂⊂7Y⊂:42CE2y9≠w2wz\P:0sK⊂⊂*4→P92z≥y72rλ;0v:YP4yP_P⊂64\z⊂7sλ0P72]P:0sH:7P9→x60qYP⊂4z⊂⊂*4~yFE4[:2y9≥x:⊂4\P4w4]4pv6≡P9rzλ:7P0H192pZP67w\↔εEεBεE;y≠3Vw7Kpy3yH⊂⊂⊂⊂λ⊂⊂+ T$`a&⊃FEεE∃42P;_v:rP≠s⊂;y≠3Vw7Kpy3yH4yP⊂≥42P9Yy;4qYP3:w_z4wwλ37y⊂≥42P:\ry⊂⊂~w:2y≤:x:⊂≥t4qtβE4yP≤tsw0[62r⊂≥t2w⊂_P3:w_z4wwλ4yP1Xv62rλ;tz4λ:42P≥y7w3H7:vq→y⊂7sλ⊂0y3]vrw:≤W⊂⊂*~2FE0\3zvr[:⊂4yH0P64\z⊂7sλ:;wP~z2vyN⊂#4y≤z⊗⊂0H64yzλ7s⊂:~2P3*[1z4w[⊂0w2λ:42P_y3zvYw:9FB:40zλ;ry2H80yiYr↔⊂⊂∀rqww→⊗⊂:4→P⊂60[q20V[4yz⊂~s⊂:4→P3:w_z4wwλ;pyPλ4w:2\892z→r⊗⊂7\εE:4→P9pvYP27z≥2r⊂8_ty⊂0\P0y3\P92z≥y79P~s⊂:4→P3:w_z4wwλ;pyP_wvx4[2r⊗⊂≠y⊂:4→P0z7[P∨FE~s⊂:4~yP4w→7y6p]4ww⊂_wzv2λ77z⊂_2P22]2y6t[2r↔⊂λ*42P≤2z:i≠2r⊂;_v:rP~yP0P≠4yz⊂λ7s⊂0CE72{H⊂37y≠P⊂:7H12P⊂→{0v:Xz2rλ4w⊂8≠0qrPλ7s⊂⊂≥42P6≠ytw3H⊂7w2K⊂⊂⊂*~4yP⊂~w:2y≤:x:⊂~yFE$[4z4p[68P)Yz⊂:7H0P19→puP6≠wx↔εBεEεE≥y73V]<x2VXy3P⊂λ⊂⊂⊂⊂∃ i$`P&"FEβE*42H;0v:YP7s⊂≥y73V]<x2VXy3P4\P:42H9ry;~qrP3≥w1z4[w⊂3'\α the useR interruPt which
is sienalled when an argument is passEd to a system function whiCh is no`(is a list of the argument which was
not accepted. The returned value is a list of a new argument to replace it.
That is, directly an argument, not a form to be evaluated to get an argument.
This interrupt is initially set to a break loop.
December 6, 1977 ∪3-1.4.3 Page 3-25
**DRAFT** Maclisp Reference Manual **DRAFT**
*rset-trap VARIABLE
The value of *rset-trap is the service function for the user interrupt which is
signalled when an error returns control to top level, just before the bindings
are restored. By convention, the handler for this interrupt should not do
anything unless the variable *rset is non-nil. This is so that the user will
not be bothered unless he has put LISP in debugging mode. The argument is nil
and the returned value is ignored. This interrupt is initially set to a
function which enters a break loop if *rset is non-nil.
There are other interrupt handlers which are associated with I/O files or
inferior jobs. See eoffn, endpagefn, (sstatus ttyint), and create-job.
1.4.4 Autoload
The autoload feature provides the ability for a function not present in the
environment to be automatically loaded in from a file the first time it is
called. When eval, apply, funcall, or the version of apply used by compiled
LISP searches the property list of an atom looking for a functional property,
and fails to find one, it looks for a property under the indicator autoload, and
it it finds one, automatic loading will occur.
Automatic loading is performed by means of the autoload user interrupt; thus
the user may assert any desired degree of control over it. When the autoload
property is encountered, the user interrupt handler is called with one argument,
which is a dotted pair whose car is the atomic symbol which is the function
being autoload'ed, and whose cdr is the value of the autoload property. The
system-supplied handler for this user interrupt could have been defined by:
(setq autoload
(function (lambda (x) (load (cdr x)) )))
From this one can see that the value of the autoload property should be the name
of the file which contains the definition of the function. Note: in the TOPS-
10 implementations the system autoload handler presently uses fasload rather
than load because the load function requires the Newio feature. This affects
the form of an autoload property.
When the interrupt handler returns, it should have put a functional property
on the property list of the function being autoloaded. If not, an undf-fnctn
error will occur with a message such as "function undefined after autoload."
Page 3-26 ∪3-1.4.3 December 6, 1977
**DRAFT** The System **DRAFT**
Examples of setting up functions to be autoloaded:
In the Multics implementation:
(putprop 'foo ">udd>AutoProg>Library>foo-function" 'autoload)
In the PDP-10 Oldio implementation:
(putprop 'foo '(foo fasl dsk me) 'autoload)
In the PDP-10 Newio implementation:
¬
(putprop 'foo '((dsK me) foo) 'autolkad)
¬
or (putprop 'foo 'tdsk:`≠JmMW↑A→CgYx@OCKQ←Y←C⊂RA←dAiQJ↓≠YIS<@AmKIcSO\↓CYg↑4∃g←e-f\
∀4∀∩∀~(~∀
∀4∀∩∧~(~∀
∀4∀∩∧~(~∀
∀4∀∩∧~(~∀
∀4∀∩∧~(~∀
∀4⊂∩∧~) KGK5EKd@XX@br\h
↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓MMk 0∪"d@λ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧
_9y$εhεP∩7
**DRAFT** MacliSp ReFerence @≠C9kC@1α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓%(E∀h@
E!"C"AQL+@~H⊂"2a≥pπgiNe
~∀DX U9λ↓απv#';≥bαC∪1¬β?'≠&+CMDλλ-lλ≥~T⊃=P⊂[8¬adop∧⊂∀λhP4)↓ααS#∃∧kπ∂3M≠Aβ↔43Gπ&{@∩α
_dX<p∩Y⊂7w a pUqh down @1Sgh@!aIXR0AWd@↓ciCG,XAoQ%GP~∃!←YIfAE@'v#';∨~a↓β↔43Gπ&K?9β4ε&∞n↑5Bαε≥lBαπ>]f'↔∀ ⊗wε↑-f∞b∧λF∂&∃`λ∧∧⊂Z3LM;Y|d<Y#!.X;≥,↑h≠qD=≠{-≤hλ≤o≥8[{∞P;t4Xt⊂0y→P⊂9p]2r⊂;Z2w⊂:~2P⊂9↑vq7v≤β are use@⊂@ACf↓YCKE⊃B~∃m¬eSCE1KfXAAe←NAYCe@'∞∪3↔Mbβ?I↓ε#=β[∂∪'πf+E9↓∧+[π∪.S'?rβ∪Kπn+M↓β∂∪∃β∂}sOSK,≠S↔⊂hS←#↔pβ¬β;|q7πS}k'
β6{K5βM→β↔[∞cWπS.!↓β?∩β←#↔rβπCCgIβ'Mπ+O↔⊃r↓αS#/I↓β∂⎇∪K↔Oε{;⊃β&x4+≠.s∂S'}qβ∂πfcE84Ph)↓↓∧MβSF)β↔[∞cWπS␈⊃βK↔∨+KO'6+3eβ-3π3W∂#↔Mβ
β≠?Kjaβ';4{K7π&K?9βM→βCW≡C↔⊃β|sS=β&C∀4+ε#1βπv!β3π&+IβC␈βC↔⊃ε{≠→9αα←#↔rβS#∃αSKO↔"βπ;⊃∧s?WWzβ≠3π?→βπK*βQβSFKMβ'v3?K7∂#'?8hS'Mβ∨+≠≠'≡K↔;SgIβ∪↔&'3↔ ↓βS=ε∪∃β?2βWO∃αβ'9β&+W∨>K;≥9α↓"O↔*βS#∃αβ[πKN3↔~↓+KO/ 4+πv!β;?/+=β'rβS#∃εs↔cQπ≠↔∂SN{99$hP4)↓αα¬βC␈≠'S'}qβ←'&C'9β&C∃βC&aβ7πJβ∃βv7↔⊃ε∪eβ7.;Mβ}1β¬↓↔β∪1βε{';S/⊃ 1↓π;#'∂Bβ'L4V ↓β;.;πS'6)↓β≠OC;W5π;#?O*↓β[πg+∃↓βFMβ7.;';:↓βS=αβS#∃ε+[π3.S?Ir↓↓β;Na↓β'~βπ3Oxh+π∂≡+CS↔"βπMβ
βC∪1πβ?';&+ImβO!β7↔∞sM↓β&C∃βS␈↓β?→π##∃β∨#π∂-bβ%;∃rβS#∃αβ7?O"βK↔∂.sP4+/3π3W∂#'?9r↓α;?&)βS#∂!βS#O→β'Mε#'≠≠/∪↔;Qε3K?5εs'1β∂→β¬β⊗K;∪'v9↓β∂|sS↔c"βC?'w#↔I0hS←#'≡Aβ7↔∞sM↓β&C∃β␈#S?5ε{⊃↓β&C∃βO&∂-↓ε{AβSF)β?W&+K7?∨!↓β↔epted as a pdl pointer; it designates the frame at the bottom of the stack.
Pdl pointers may be used as arguments to several debugging functions described
in the next section. Since the fixnum value of a pdl pointer has only internal
meaning, generally a pdl pointer cannot be obtained from user input, except by
the user typing in a pdl pointer chosen from a list of pdl pointers typed out at
him. The "frame" functions described in the next section may be used to obtain
pdl pointers.
An important thing to note about pdl pointers is their limited scope of
validity. If the information on the pdl which is named by a pdl pointer has
been popped off since the pdl pointer was created, the pdl pointer no longer has
valid meaning.
1.5.2 Functions for Debugging
Page 3-28 ∪3-1.5 December 6, 1977
**DRAFT** The System **DRAFT**
*rset SUBR 1 arg
(*rset x) sets the *rset switch to nil if x is nil, or to t if x is non-
nil, and returns the value it set it to. (See below). This function
exists primarily for user typing convenience.
*rset SWITCH
If the *rset switch is non-nil, extra information is kept by the
interpreter to allow the debugging functions, such as baktrace and
evalframe, to work. In addition, the interpreter will make extra checks
such as checking the number of arguments passed to a subr or lsubr and
checking that array subscripts lie within the declared bounds. Generally,
the *rset switch being on means "I am debugging"; this is known as "*rset
mode". The initial state od the switch is nil.
nouuo SUBR 1 arg
(nouuo t) sets the nouuo switch.
(nouuo Nil) turns off the nouuo Switch. (This is the initial state.)
nouuo returns t oR nil according to whether it turned the nouuo switch
on or off, (See below.) This function exists primarily for user typing
convenience.
nouuo SWITCH
If the nouuo switch iq on, function calls made by compiLed functions to
compiled functions op∧@AgegiKZAMk]
iS←]LACeJAM←e
KH@AQ↑@AO<@AiQI←kOP↓iQJ~(@@@@↓S]iKIaeKi∃dAKC
P@Ai%[B\@↓)QSf↓CSIfAS\A⊃KEkO≥S]N\A∪L@↓iQJA9←kk↑AgoSQGPASL~∀@@@A←M_XAoQ%GPASLAiQJ↓]←e[¬XAGCMJX@A
←[aS1KHAG¬YYfA
C\AE∀A[CI∀Ai↑@↓O↑AI%eKGi1rP~∀@@@A]QSGP↓SfA[UGPAM¬giKd8~∀4R↓↓↓↓α↓↓αSF)β;?-+=βO>KS∂!εkπeβ⊗)βSW⊗s↔⊃β|3⊃βπ βπ;e¬#'7∃p↓α↔π≡A↓β∂|¬WεNL\Bε7]l7&N⎇aPRα∧∧αε≡≥MBπ>≥MBε}mK∩ε>t∞FG⊗|XvBπMRεNnLWππ,ZF/∩
xL<(≠;n+λ⊂.D≥z~,=λ≥~-\αP⊂4]⊂;tf≠∧@
be linke` directly(@A%LAiQ∀AG←[ASYKHαβ∂?∪*β#πM∧∪↔↔→¬∪↔3?∞#↔↓βL¬g&Z∞Mε*π?~7&.QQ"αα∧∧π>OMπ&FT
¬-∀T wπ&≥⎇bαG<XRπε≤|Rβ~β(J
P:42[⊂:44\P24`2ect Linc may be qfsNappeD
and the I`≥i∃`CK,εF/∩∞-w/&T
&*N↑:F∞⊗M~6F.D∧ε↔J¬∞7∨&≤¬≥.P⊂:j[v4w5\TW⊂⊂⊂2qpz\p@
λλ
*&+∂π↔⊗+@∩βeDβKvpλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∧f5,+E%@→⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂(_qrP→KY_
**DRAFT** Maclisp Reference Manual **DRAFT
*
the PURE option requires an amount of extra space and time, it is not
normally on; thus links snapped in code loaded as non-PURE cannot be
unlinked.
The trace package turns this switch on when a function is traced, in
order to ensure that tracing will work even for compiled functions.
Compiled function calls which have been "snapped" to go directly do not
push debugging information in *rset mode and cannot be traced. See also
(status uuolinks).
baktrace LSUBR 0 to 2 args
baktrace displays the stack of pending function calls. It gives
detailed information only in (*rset t) mode. The first argument is a pdl
pointer, as with evalframe. If it is omitted, nil is assumed, which means
start from the top of the pdl. The second argument is the maximum number
of lines to be typed; if it is omitted the entire stack is displayed. (The
second argument is currently permitted only in the Multics implementation.)
The information printed by baktrace is not the same as that obtained with
evalframe; both should be used to get the maximum amount of debugging
information.
baklist LSUBR 0 to 1 arg
baklist returns a list containing the information which baktrace would
print. (This is available only on the PDP-10 implementations.)
errframe SUBR 1 arg
errframe returns a list describing an error which has been stacked up
because of a user interrupt. The list has the form (err pdlptr message
bcp), where pdlptr is a number which describes the location in the pdl of
the error, message is a list of from one to three things which, given to
the error function, could have caused this same error, and bcp (binding
context pointer) is a number which can be used as a second argument to eval
or a third argument to apply to cause evaluation using the bindings in
effect just before the error occurred.
The argument to errframe can be nil, which means to find the error at
Page 3-30 ∪3-1.5.2 December 6, 1977
**DRAFT** The System **DRAFT
*
the top of the stack; i.e. the most recent error. It can also be a pdl
pointer, in which case the stack is searched downward from the indicated
position. Thus if there are recursive calls to the error handler, the
second error back down the stack may be found by:
(errframe (cadr (errframe nil)))
The argument to errframe may also be a positive number, which is the
negative of a pdl pointer. This means start from the position in the stack
marked by the pdl pointer and search upwards.
If no error is found, Errframe returns nil.
errprint LSUBR 1 to 2 args
errprint Treats its arguMent The same as errfraee. The secOnd areumeNt,
in Newig ImpleMentation only, is the file(s) Into Which to print the
inf@=aSCi%←\@@!gKJ@↓aeS]PRP→↓ααS#∃αβ7/><⊗>
∞
wπε≥⎇bαε|dαπ&Tαε/.-wααn&∞nT
↔λh$∧ααα∞
&Nv4|V"r∧Wπ↔∞-⊗w"∧∞&/'↑-g
πD
⊗ $λ_
\αyypYpP⊂+XyP:<\2r⊂']z⊂⊂ [2⊂74[⊂⊂4`& ng
erro@HAMeC5JAoCLAMOkαs⊃8∀Ph $-3π3≠⊗7¬↓α↓↓↓↓α↓↓↓α≥*αI↓λ∧ε∂⊗qQ hR∧∧ααα∧∧¬&FT↔⊗?]\Vw"∞Mrε/l≥F .X;9$
<hλ∀≤→≠∧∞≠z3NL<Kλ≡h≥z.Mλ→4N\X;,Uβ⊂⊂⊂∃42P(→6εE⊂λ⊂⊂⊂ )pεAgKα@⊗≡X ∧∧→[p→λ0p∞ evalUatioN h∂LAα ↓β≠,s∂S'|qβ∂πd¬Bbα∞Xm≥Yh⊂~~2P⊂)XvrP 2ules
λ∧@@@ACE←β+Q↓β≤εF∂↔M_L@P87`)np @¬]HAI%`↔∂&K?9↓∧∧↔4→<\L@90vrH⊂:y`%pεP→↓αβ↔[πd∧g,8εrP_v;p|\β
α s@-SafAα{[↔I∧∧⊗wJ8λ-Mα9P 4o idself @QQChAαKQβ≠L¬f'~
→bπεTπε&EaP@@ ¬⊂⊂λ⊂⊂⊂⊂λ*42P≥0p`+∀ASfA∧AQSgP@QiSββ∃βC&cCCI∧∧f␈⊗β(⊂⊃_x⊂ , where pp∪Aα)β'M∧∧W6∞βλ⊂↔\α a`@AYrX~(@@@@↓aIYaQ` β'~β¬βC&aβC?LsS↔I∧εFzπMRε/l≥G.∂M→vrε≥`π&FT∞7&∞=1Bπ∨]~F∞⊗LTε&@|H⊂~\pP0yCE⊂⊂⊂λ⊂0w argu@5K]hAβ#=↓β,εf∞fn,⊗n
xD<XYN99(
}Hλ_L≥⎇≤X,<+λ⊂∪≠y2P$\β the fo@IZAEK%]N~∀@@@A∃mCY@.S↔⊃ε{A↓β
β3'O"↓β?→¬##∃↓εsπ7∃ε{⊂∩α∞Mε*εnYf∨&≥⎇bαε,Y⊗v:≡πεf≤\Bαε≥lBπ&QPRα∧∧αε∂,}Vn.β]≤d
=λ⊂≠XyP0x≤64rrλ:7V⊂_w2⊂1_x⊂4iH0P14[24w3H1ww:→|:⊂8≠tw:2\⊂;t4Xt⊂1p[εE⊂⊂λ⊂⊂12H8yrbλ;tz4λ2{0vλ:7P"]0r2p]2P9w[pz44[3P4wλ:42P_4w24[3P1w[:2|:λ⊂5:y]⊂12s≠y2FEλ⊂⊂⊂⊂≥42P2]0v:p]4ww⊂→7zw2λ1<P"]0v39_vrWεBεE⊂⊂λ⊂⊂⊂⊂λ2{0v→90vrH92z:\79P7~v⊂4sλ77P2]0v:p]4ww⊂_pw⊂1→P37z[2↔εEβE⊂⊂⊂λ⊂⊂⊂⊂→{0v3≤0rrP≠w6<P≥wy5yH4w⊂∀
99rzλ:∀P6[r2V⊂≤tw1rH77P2↑890P→90vrH4w3'\6pz4[wεE⊂λ⊂⊂⊂4\P9p{→r⊂7z~2y;t\rWεEβEεE"→qrvq→y⊂≠⊗λ_\[[H⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∧YVXW
W→⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∀0srPVYXFBβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂&Xqv4y\⊂)2s→y2w1YP&pw≥pv⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*¬
εEεEβE392]:y7⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂)ja∀⊂→⊂0\3yFEβE⊂⊂⊂λ⊂⊂⊂⊂
392z≥y7⊂8λ<∀P⊂≤2z:y≠9P1w[:97vλ:7P:~2P⊂2]0v:p]4ww⊂→2yts[0z2rλ1<P⊂≥42P8→6εE⊂λ⊂⊂⊂8≠tw:2\⊂8⊗⊂_w2⊂3≠y1ryH4z⊂⊂≥7P92]:y7⊂≡↔⊂⊂*~4yP⊃≠7w⊗v≠qpv⊗Ywz7Qλ⊂3:w_z4wwλ1pwεB⊂⊂⊂⊂λ12P:\rr⊂:≠P27P→0w1|H92qw]2y<P→97vP→y97y≤WεEεBεE2{_v47wZP⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂+ T$`a&⊃FEεEλ⊂⊂⊂⊂λ⊂⊂$sλ:42P≥0v:rH7s⊂2]0v47[uP4yH77w⊗[:v6⊗λ:42wλ9x2qZpv⊂:~4w3yH40x8→w⊂⊂4[⊂:42CE⊂⊂⊂λ⊂2{0[:pz7\↔⊂⊂+Z2w⊂⊂_P37y≠P⊂∀2]2w⊂0[⊂0z7[TP⊂4\P:7Pλ12P2]0v:p]2r⊗⊂λ2{0v~7wuP~yFE⊂λ⊂⊂⊂1≠zw2⊂≥7P74[⊂0w2λ:42P→:w1z~ww0vλ37y6H;t4qZ⊂;pyH4z9P≥0v:rH4yP0\864rY⊂⊂:7H7w2FB⊂⊂⊂⊂λ0y3z[rw:⊂P:42H37y6H:40zλ;pyP≥9<tw→P:7P_2P2{_v:pz→r↔⊂⊂∃42P;_v:rPλ4z⊂9→z:y7≤FE⊂⊂λ⊂⊂4yH:42wλ92z:\72r⊂→97vP≥42P⊂→{0v:Xz7y↔λ⊂*44\P32p]:y2P~yP:yYr⊂1<H⊂:42H)z2x≤2yεEλ⊂⊂⊂⊂≤0qupYrP22\qy4q→r⊂60]2y⊂4[⊂:44\P9rq]4ww↔βEεE⊂λ⊂⊂⊂⊂λ⊂2{0[47wuH4yP1≠zw2⊂≥7P74[⊂1<P_92puK⊂0w2λ9rz8Irr⊂:≠P74vλ1<P2\97y9H⊂:40]⊂3wFB⊂⊂⊂⊂λ10quH:7P:≠x⊂62]2v⊂⊂_w2⊂8≤4w:⊂
↔⊂⊂*~4yP⊂≤97{4Y2yP:~2P0q~v4z<H:7P⊂→yqpx→P397[FE⊂⊂λ⊂⊂:4~yP6wY2P4sλ9wvr]44w3H10r⊂~0x82[9WεEβE⊂⊂⊂λ⊂⊂⊂⊂∩w⊂7y→2y⊂7≠z⊂:7H4vx0Zy⊂⊂:~2P2s→4qtr[1|P7Y⊂:42H&$ihλ⊂4w:→y892]2y⊗⊂≤r{2y_vεE⊂λ⊂⊂⊂9→yz94Xz4ww≤P⊂0y→P4vx≠yrr⊂λ7w⊂2]0v47[uW⊂⊂λ$z⊂7[6<P⊂_x864YyP:7H⊂2{0[:pz4[w⊂⊗FB⊂⊂⊂⊂λ;t2z~2y⊂4[⊂⊂0P≤2pr⊗Y{0v⊗\94w:λ67wx⊂⊂4w≥2y70[6<P4[⊂2{0[:pz4[3P⊂0\3zvr[:9P4[εE⊂⊂λ⊂⊂37\6yV⊂≠y⊂⊂1≡P2|8≠4qtzλ⊂:yrH7s⊂⊂≥42P3≥w1z4[w⊂⊂2]0v↔⊂λ$z⊂⊂→7ryP≠7z⊂⊂~0{2P_w<FEλ⊂⊂⊂⊂→s32q]⊂7w⊂_wvx4[2r⊂3≥w1z4[w⊂92Y2y2w_ryV⊂≠w⊂:yYP7s⊂≥42P3≥w1z4[w⊂0x≤6<V⊂≠y⊂7wβE⊂⊂⊂λ⊂:42H⊂⊃6p\84w3H⊂3:w_z4ww≤W⊂⊂⊂⊂v9wVλ0yP⊂_P9x2Xtpv⊂λ1pyrK⊂:42H⊂0y9_|P92Y2y2w_rFE⊂λ⊂⊂⊂;Z4qt⊂λ4yP⊂≥42P⊂→4y9zλ0y3z[rw:⊂λ:7P⊂≤z7y2H⊂4yP≠2{2yλ⊂9rr[⊂⊂1<H⊂:42H2{0v~7wuFB⊂⊂⊂⊂λ3:w1]4ww≥H47{r]2y⊗⊂≥42P9]q2|8≤2yyt[w9P7Y⊂:42H0y90↑P92s→y2w1YP⊂∀:~2P4w→4qryJFE⊂⊂λ⊂⊂;t[6⊂12H9rrw⊂⊂∀*~4yP9\2qtp[⊂:92Xz6rw≥⊂0{7Zr9P0H897q≠2vP;Zz4⊂:~2P⊂;X|P9z≠y2FEλ⊂⊂⊂⊂≥wy5yK∀P'7\6pv6≡P⊂:4→P2{0[:pz7\⊂27r\P⊂77]⊂1t2XuP:4→P⊂;0[:rP7Y⊂⊂2{_v47wZV⊂4wβE⊂⊂⊂λ⊂7y2→y⊂:7H⊂9p{→P:4vYW⊂⊂*≠P⊂6pZrP4zλ1t2qZV⊂⊂<[zP6z\z⊂17]4⊂⊂1→P4w⊂
∃99r]⊂⊂:∀H⊗FE⊂λ⊂⊂⊂2→q:ssZw3P⊂P⊂6wY2V⊂⊂λ0w2⊂λ40{2H⊂27w→P⊂⊂∀≤yz0z≥yP⊂2]0v47[uP⊂:
W⊂⊂⊂λ'7z⊂λ0v6εB⊂⊂⊂⊂λ4vx6→vrw:_z4ww≤P72rY⊂⊂17]4⊂7sλ:47yYV⊂⊂1≥z⊂<w]P9t7]v2⊂⊂_v;p|\P27P_7z4⊂λ:7P1→FE⊂⊂λ⊂⊂9z\2W⊂⊂∩s⊂<w]P⊂:yYP:42H)z2x≤2y⊂⊂≤0qupYrV⊂<[zP72Yr⊂⊂7≠z⊂;w\9<]P~z⊂⊂2≠ryP:~4yFEλ⊂⊂⊂⊂_zz7vXz4qp[6<WεBεEεE→{0v4≠wuP⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∪)ja)λ→⊂7yλ→P0y→yFEεB⊂⊂⊂⊂λ⊂⊂⊂∀→{0v4≠wuP⊂→7y6P~7wuTH⊂4yP_P⊂3:[1z4w[⊂;t4Xt⊂⊂4→v89P→|867Zz⊂⊂:~2P2{_v47wZFE⊂⊂λ⊂⊂32Xz:y2K⊂⊂⊂*~2P⊂3≠y6P⊂~yP⊂2]0v:p]2r⊂⊂≥tz4⊂λ2{0v~7wuPλ60vq→0Vq7]w2⊂⊂λ:7P⊂≥42FEλ⊂⊂⊂⊂→:w1z~ww0vλ⊂37y≠P⊂47[uW⊂⊂λ*42Pλ1t2qZtw3Pλ7s⊂⊂→{0v4≠wuP⊂~yP⊂1≡x0yyYr⊂⊂4[⊂:42CEεEεB(0srH→VYYλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂ YVLW~W→λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂⊃2qrvX2y⊂≠⊂_\[MFEβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ*42P∀|yz2[P⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*∃
εEεEβE⊂⊂⊂λ⊂2{0[:pz4[w⊂⊂7Y⊂37i≠P⊂4z≤rv3⊗λ⊂1:jλ77z⊂λ4w⊂0[<P⊂9]q9tb~py<Pλ2{0v≥pz4w[9V⊂#≠yεE⊂λ⊂⊂⊂4[9z0w_rP⊂7Y⊂⊂0y→zvrw≥9P⊂4[⊂⊂:4→P37y≠U⊂⊂⊂∃44yPλ4yP⊂≠4urPλ0P⊃7[2Vtw≤z9:q]4wwεB⊂⊂⊂⊂λ897qYrr⊃⊂λ4w⊂⊂_P⊂6pXt4w2Kv0w3]psrP→2q:sYry↔⊂λ⊂$s⊂λ0v6⊂λ:492YP⊂0y→zvrw≥9P0y→FE⊂⊂λ⊂⊂89→yrw:⊂:42H9rqg[2⊂4yH0P14[24w3H1ww:→|:⊂8≠tw:2\⊂0w2λ4yP:\rr⊂0\P⊂:4→P9rq[w2εEλ⊂⊂⊂⊂_y3zvYw:⊂*≠P2{0[⊗⊂0w→⊂:42H:44y→⊂0y3]vrw:λ4yP:~2P47[uWεEβE⊂⊂⊂λ⊂⊂⊂⊂⊃|0vx≠2]εEβEεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂
22s*[⊂47wZP32|≤9⊂∀<
P⊂⊂⊂λ⊂⊂⊂⊂λ⊂≥qp[62r_yP∀4≠ (prog2 (sstatus evalhook t)
;magic sstatus
(evalhook (car x) 'hooi-function)
;evaluate form
(sstatus evalhook nil)))
;more magic
t))
¬
(defUn hook-function (f)
((lambda (terpri)
(decLare (special terpri))
(princ '|form: | msgfiles)
(prin1 f msgfiles)
((lambda (v)
(terpri msgfiles)
(princ '|value: | msgfiles)
(prin1 v msgfiles)
v)
(evalhook d 'hook-function)))
t))
;this is how to eval the
; form so as to hook
; sub-forms
The following output might be seen from (hook (cons (car '(a . b)) 'c):
form: (cons (car (quote (a . b))) (quote c))
form: (car (quote (a . b)))
form: (quote (a . b))
value: (a . b)
value: a
December 6, 1977 ∪3-1.5.2 Page 3-33
**DRAFT** Maclisp Reference Manual **DRAFT**
form: (quote c)
value: c
value: (a . c)
(a . c)
The following functions only exist in the Multics implementation.
baktrace1 LSUBR 0 to 2 args
baktrace1 is the same as baktrace except that binding context pointers
suitable for use with eval and apply are displayed along with the function
names.
baktrace2 LSUBR 0 to 2 args
baktrace2 is the same as baktrace1 except that pdl pointers, suitable
for use with baktrace and evalframe, are displayed along with the function
names and binding context pointers.
Page 3-34 ∪3-1.5.2 December 6, 1977
**DRAFT** The System **DRAFT
*
1.5.3 The Trace Package
The LISP tpace package provideq the ability @Q↑AaKIIWeZ↓mCeS=kfAC
iS←]LAChAQQJ~∃QS[JA∧@AMk9GiS←8ASfA
CYYK⊂@AC]⊂AChAQQJ@AQS[JA%hAeKQkeMf8@@A)!SfAG¬\AEJAkgK⊂AM←d4∃ieC⊃SiS←9CXAiICGS]≤A←dA→←dA[=eJAg=aQSgQSGCi∃HAIK kOOS9NACGQS←]f8~∀4R↓↓αSF)βSK∞≠∃↓βε∂/π>)β'Mαβ;?QπβπKQε{⊃↓β&C∃β'vKS'πb↓β↔;6KK/;n+;QmεC?←↔6+I1↓εKQβ'_h+πW&{7πSN≠π33J↓β3?∞#↔⊃βLq↓β?rβS#∃αβ≠'K≤εBπ⊗\lW⊗.l8RαπMtπ&FT∧ε7.l:FN}d∧π'⊗≤<R`$
∀y,Q"X=.M{≠x,EJ#"AQHλλ
M→(∪ ~tλ≥∞8y(∞8zx,|(_smnz<⎇∞∀≠yH∞M≤Y9$
8:;D];XnM;{\eD≥≤X,<+λλ∞]]≤X,<+λ⊂-lβ"\L]=≤X,<+λ⊂-Mλ≠qD∞z~8m∧_<Y$Y>≤∞.kC"AQHλλλ∀_x;
D≥≠h∞NX8q$
_<h∞M→(→M⎇≠≠um≥Yh→M}[(
εB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ∀:90XpP:9_qro`3pecs)
¬
A trace←spec intqrnis eItheran atkm (the name Od∧AiQ∀AMk]
iS←\↓iV@A JAie¬GKHR4∃WdA∧AYSgPp∩∀@@@@@@@@@@@@@@@@@QMk]
iS←\5]CKJ↓←aiS=\bA←AiS←\H@\\\$~∀
∃β;#↔K*βS#∃ε{CS'}sMβπ⊗)βπM∧3?33␈;Eh∀Ph+K.%βC⊗+⊃↓↓α↓↓β∂∂+O↔Mαβ¬β⊗+π-↓ε≠S↔∩↓βCKLsS';8∧π&FT∧ε.wN/∩π',≤6*α¬
⊗2α≥gJJ.W hαHλ∧∧λλλ∧∧λλλ∧∧λλ_L\[|Y$<≤≠∂≥9Y`∧∞~→(∞NX8y,Dλ→]-l⎇~;md≥≠h∧
=≤h≡Y⎇3,]]≤k∧∧~9H≥Yβ"D∧λλλ∧∧λλλ∧∧λλλ∧
{[≡$
9H≤∞,9λ→.l;≥8.L<h≥
t≠[sE]Z;AQA"Pm⎇Yλ≤∞,9λλ∧∧λλλ<=<y.∀≥≤X,<(~3Lm|[8.M;{H∞Mh_Y$∞≤Z;NL9λ→M}H→]-l⎇~;md→;]∞/(_;LE{|C!$λλλ∧∧λλλ∧∧λλλ∧∧→>~.D~9H≥Yλ≠mm≡(~,D≤≤Y,D→=X-N8=→.4≥≠h
m{K;M≥C"AQ]z→.,:;HmHλλ∧∧λ_x.↑y<h∧∞~→(n;X⎇
≥{Hλ∞Mhλ_LT≥≤X,<9λλ
⎇[≡(∞⎇→;H∧x;≠\λλ→N-{(≥
#"H∧∧λλλ∧∧λλλ∧∧λλλ∞>→8z,m99λn;X⎇
≥{H→MeHλ∃
(≥<l↑H_x-d→z=LT≤y=L↑X;λ∞NX8y$∞|→8n4≥≠c!$λλλ∧∧λλλ∧∧λλλ∧∧≥≤X,<+λλ≥≠λλ∞>→8z,o:;Yd∧≥~→$∞x;9$∧→];L>~;{D∧_]=∧∧≥z=
∧→~9Ll<Y;NA"Hλ∧∧λλλ∧∧λλλ∧∧λλ≥m<Y:-d≠|≥
≥{\k∧∧≤{h∞M_=λ∧∞~→(n;X⎇
≥{Hλ
≡h≥≤L≤y9λ∧
;H→
≤YY<L]]β"D∧λλλ∧∧λλλ∧∧λλλ∧∞x><d∞z→;Dx;≠\λ→\M⎇(λ→
≤YY<L]]λ→N]X⎇~-⎇\kH∧ [⎇→$∞~_=∧
9HλmH~<aQHλλ∧∧λλλ∧∧λλλ∧∧λ_;∞,89≡$Y:;Ltλ≥≤L≤y9λ
≡≤y;eλ≥~Tλ≥z↑Y:;D
|≥~-⎇Hλ≤∞-xX8MO(≥z-Mβ"H∧∧λλλ∧∧λλλ∧∧λλλ
m⎇λ≥m}Zh_.4→→<m≡Y9D∧
∃~]H_9l≥;Kλ
≡λ≠:,⎇≥J$∧∪[uT≥~_.Dλ→[D
8>#!$λλλ∧∧λλλ∧∧λλλ∧∧≠[⎇∧Y(_${{<
≥→9λn;Xu
≥{KC!!"X<L}→≠λ∞≠λλ∧∧λλ≤n8z9M≤<h_-d_=≠mT≤→≠∧∧≥z≠n<(≥X-N9(≥∞8y(
≥Z=~,≥≠≡(∞<=≤h∧∞≠h≠M≥C"D∧λλλ∧∧λλλ∧∧λλλ∧λ(λ≠
≡⎇λ≠lDλ≥~T_⎇<N,;]λ∧∞Y8⎇..z;{D
→=Y-Dλ→[n∧≥~→$∧→];L>~;{ED≥~→!QHλλ∧∧λλλ∧∧λλλ∧∧λ→]-l⎇~;md|h≠L≥9+λ≥Yλ_$
~<⎇∧
yH≥
(_<L};9;NNh~<d{{\d|9λ≠mn≠h≥
#"C!!"Q→,<;8Y.$
Kλε↔-mh∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∧f5,+M%fhλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∀≤y(eVm#"@↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∪,≤{~<n∧∀Y9L↑Y;XlT∪8;N\;λλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧
JQ
(1U
E!"C"AQHλλ∧∧λλλ∧∧λλλ∧∧λ≤→
D≥z→-d≥~→$];XnM;{H
≡hλ→-n→<Y,Eλ_;LD_y≤D|9λ_L≤zh≠llHλ≥m;H≥
#"H∧∧λλλ∧∧λλλ∧∧λλλn;X⎇
≥{H~.4→>~.L9H∧
~→(∞≠λ_l≥H_Y$
;\|\⎇→9∧\[{$(_\L\:|≠m≥]β!$λλλ∧∧λλλ∧∧λλλ∧∧→[|D>_;.
→+λ≥Yλλ∞↑y9λ∞Mh→→.L<[:-l(λ≥
(≥Y./(≤Y,<;]λ∧
~<⎇
}↑(≠la"Hλ∧∧λλλ∧∧λλλ∧∧λλ≥
(→]-l⎇~;meHλ∃
<h≠n∞~;{D∧_x;DY(≥.<9λ≥m≡~λ≠n$λ≥z.M≠⎇=∧∞≤Z;NL9β"D∧λλλ∧∧λλλ∧∧λλλ∧∞≤X8lT≠⎇=∞∞=H∧λ88z∧∧→];L>~;{Dx;H,(→z.l;Hλ
≡≤h≠n⎇H≤→
Eλλ≠n$≠{Y!QHλλ∧∧λλλ∧∧λλλ∧∧λ≤→
D≠8>$∞y<]LT≤y=L↑X;λn;X⎇
≥{\kAQC"Y-n≤↑(
M<⎇λ∧∧λλλ∞>→8z,m9<h∀≠~<nD≠yH≡XZ=∞,<↑(
59>≤∞,<|z-⎇values are to
be printed along with the usual entry-trace. The list of
resultant values, when printed, is preceded by a \\ to separate
it from the other information.
exit list similar to entry, but specifies expressions whose values are
printed with the exit-trace. Again, the list of values printed
is preceded by \\.
arg that the function's arguments, resultant value, both, or
specify
value are to be traced. If not specified, the default is
neither
both Any "options" following one of these four are assumed to
both.
nil arbitrary S-expressions whose values are to be printed on
be
both entry and exit to the function. However, if arg is
specified, the values are printed only on entry, and if value,
only on exit. Note that since arg, value, both, and nil swallow
all following expressions for this purpose, whichever one is
used should be the last option specified. Any such values
printed will be preceded by a // and will follow any values
specified by entry or exit options.
If the variable arglist is used in any of the expressions given for the cond,
break, entry, or exit options, or after the arg, value, both, or nil option,
when those expressions are evaluated the value of arglist will effectively be a
list of the arguments given to the traced function. Thus
(trace (foo break (null (car arglist))))
would cause a break in foo if and only if the first argument to foo is nil.
Similarly, the variable fnvalee will effectively be the resulting valua oF
the traced function. For Obvious reasons, this should only be used with the
@∃qShA=aiS←8\~∀~(@@A)!JAie¬GJAgAKGSM%GCiS=]fA[¬rAEJEMCGQ←eKH8D@A
=`AKq¬[aYJ0~∀~∀4∃!CO∀@fJ@≠1↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓M~iE)Uq→↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αα∪↔∂.k↔Iβ11↓EK9T4(1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓αS#*αOgO&+5↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~"Q(4(hP4)↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓G#Kπ∂*↓!#≠}yβπ∩Iβ←#/∪↔'9ε∪πiβ63W∃JH4(4VKMβ↔∂+'[πf+;Qβ&x4(4R↓↓↓↓α↓↓↓↓α↓↓#S⊗∂∃↓F3?=β>C↔K↔NqβπRβ[π3.)%↓#⊗Iβ←F+K↔'rβπiπ3π3W*I$4(hQ↓↓α∞c1β?/#CWQπβK';&+⊃βJβSKπ≡)β∂πrβ∃β?∪?W;"β';Szβπ9βLs∪↔;&+⊃1↓π∪↔π∪∞∪3∃β6{K7π"`4+JβO'7εceβO/#S';:βS#∃π3πK'∞∪3∃↓π≠CK'w#↔Iβ&yβQ9ααO↔S&K;≥β∨βK';&+IβSz↓β;'bβ∂#πv;↔L4W##∃β⎇+SCW"βπ∂Z↓βS=π+O∃β&C∃↓β␈∪∪';∂∪eβC⊗K;Qβ7+;∂SN{91↓π;#'∂Bβ'Mβ6OS↔∩↓βπ;"βWO↔_h+3↔∨→βOS␈∪π∨∃ε∪WQβO→β3↔∨→βK↔∞#π3*β≠?IεcπK∨*β3'O"βOSK.≠SWK/→84(hP4)↓α↓↓↓α/Cπ7Cd+Mβ?2βS#∃π+O∃β}1βSK∞≠∃h4Ph)↓↓α↓↓↓!
IαS=π#Kπ∂*β≠W;∨#'?9ε3?=1¬βK';&K;≥β⊗{S!β∂∪∨W7.sSMβ}qβ↔;'∪eβπv!↓βK/≠W3Qε{84)α↓β↔cO!h4)α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓#'∪π∂∃ε3?=$hP4)↓α↓↓↓β␈⊃↓#S⊗∂∃↓F3?=%Jβ?I↓G#Kπ∂*↓#≠?zβ?SBI%84Ph)↓↓α↓↓↓!∩IαS=αβSKπ≡)β≠Wv≠S'?rβ≠?=αβ?;3Jβ←#↔rβ∂π3f+⊃↓β7∪?5β5+;∂SN{9β∂⊃1↓β∞s⊃βSF+84)α↓β?;gIβ'→αC∂∪IπA%β'~β;'1Ph)↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓G#Kπ∂*↓#≠?zβ←#↔⊗+'9β⊗Iβ∂|s⊃↓#w+31↓F≠∪IβBI%%$hP4)↓α↓↓↓β␈⊃↓#S⊗∂∃↓F3?=β≡{;⊃↓FsW31αC∂∪IπA%%β>C↔K↔Nqβπ∩I$4(hQ↓↓α∂→βS#M→β↔c∞kC3∃π≠#?←~aβS#*↓β?K&+Iβ?2βS#∃ε{CS'}sMβ7∞[↔Mβvy↓β∪N3≠↔K.s∂∃1ε+c∂↔π 4)↓αβ≠?IεK≥1π3π3W*aβ?&A1β?∩β;'1bβ←#'≡Aβ7W∨!β∃εcπOQph(4)α↓↓↓↓αAM%α&yβSK∞≠∃β≠.s∂S'}qβGW/A1βC⊗K;S'v9βS#*βK↔O.cSπ;"β[π3.)β?9ε+c'SNs≥β/!β;<hQ↓↓β∂∪∨W7,sSMβ}qβ↔;'∪e!βπ∪';SNs≥↓β&C∃β[∞cW¬β}1↓#∂∂⊃↓βaJβ?9β,sSKebβ?→↓ε3?=Ebβ≠?=∩`4)↓αβπ;⊃αC≠?=~βπIJβ?9β,πεO"Dλ⊗v"
|bπW>f⊗vT⊗v"¬∞↔>/.O∩π≡∞,Fg*∀
vrε-}FBα]g'↔∀⊗v Q$ααε←
↔#PQ!PRα∧∧ααα∧∧ααα∧∧ααGN,⊗≡*¬∞↔//∧Vw'/∀αBF<≡"πB∃∀ε/F≡DαF6⎇v∩ε6⎇v"αFm⎇s~ε,≡"JHQ$ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααε-}FBπ/76⊗mTαG∂|↑''J∞=π⊗&NU∩JHQ!PRα∧∧αααεE∩α¬Mtπ'⊗≤<Rαεn]f∨&≥⎇bε6⎇tαε}mO∩π>]bαε<≥Ff.D'JαnVv∨M≥vw~,↔∩α≥f"ε,∨"`h$∧αππ-≥g&Nlpε∂⊗}4ε}rYg'↔∀⊗v"∞,W∨.NDαε}dWFOEDππ⊗≥nFNvt∞FF*∞l⊗g.T
v"α¬∞↔//∧&∂⊗aQ"αα,↔↔ε¬∀ε}r←εO"n&}jivzα∞⎇ε.r8⊗ff\@ε↔J,↔Rε⎇mGJB≥f"α=vv&≡M⊗}v≥MGJε.,V∞↑≥lphR∧∧π>F]dε≡∞MLV"ε/∀ε⊗∂$
⊗"ε∀λW∂.≥N2ε∪!Q hPQ!PT&\8Vn⊗↑$β2bε↔∪;:∧∧ααα∧∧ααα∧∧ααα∧∧αα↓65S
sUf2αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧αα¬≤v*β5V38h bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧ V∞≡M≡7α¬,\f/⊗]l6*∧\≥g.∞D∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jA"Ph!Q hPQ$ααα∧∧ααα∧∧ααα∧¬π'⊗≤<RαFm⎇rπ>↑&.Nd&∂∩.&.∞4¬ε/∂\≥Bε
!∩Hh$∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧αF6⎇tπ>F↑,VNr,↔Rε←
↔"α¬∞↔//∧&∂⊗d&∂↔
↓∩JJ⊃Q hR∧∧ααα¬εRJ¬Mtπ'⊗≤<Rαεn]f∨&≥⎇g~π
vzε≥lBε7UDαεv↑lWαπ∞-⊗w&≥lrε∞o≡FFNlpαε6}$ε.OMW∩`Q$ααε.ZBπ≡≡i⊗v:≥Fbε≡,w.n]nG~εmz"ε⊗}Mαε}d∩ε≡⎇]V}r∞Fbε<≥Ff.Df}␈MBbε≥lBε↔,\⊗↑NlqPRα∧
⊗w≡≤LRπε
⎇rεNd∂αεO4
fNc!Q hR∧∧ααα∧∧ααα∧∧ααα∞N&∞≡T¬πεF⎇tε∂⊗}Fbεm⎇wε&D'⊗.≥4αFw]MBπB∀λ6}vD
fNb
m⊗bHQ$ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααFnTε∂⊗}Fbεmywε&D6}vD
fNb
m⊗bJ⊃Q hR∧∧ααα
Mε*α,=vv"
m⊗b∩∧∞π⊗/lYg'~≥gO&
≥f:ε≡@ε∞fD∧ε7⊗⎇Tε⊗.≥lrππ-≥g&.Edαα¬MRπ≡\9vv Q$ααεm≥BεNdV∞≡∧∧π'⊗≤<Rπ∨\2π∨\6N6≤↑2απM↔"εmtε∂⊗}4ε␈∩∧∞f∞g\Tε∂⊗T∞Fzα,Rππ-≥g&.G1PRα∧⊗g&
}V>B∞Mε*ε=⎇f"εm≥Bπ>}]F"π∞,W6.nDπ&FT∞π⊗NnMw/"≥gO>∨∃Bπ∨\6N7≥≥f:α∞MεO~∞Mvxh$∧αππ,↑f.wN4π'⊗≤<Rε7-⎇Rε/lXD∞y=≥
≥Yh≥.∧≥~→$
98z≥Z<s.4≥≠hMh≥~
≡kC"AQHλλ∧∧λ≥≤L≤y(∀L↑≥<[N4_<h
≡≤hλ∞l;≥9$(≠~.>λ≠yD∧≠X;,↑h≠yD;≠λn;X⎇
≥{\h∧∞≤X8l\∞h→M}C"H∧∧_;↑$];XnM;{\d∞≤X8l\λ≥z.Mλ≥~T≥z→.,:;H
}≥~;meλ≤x/∀
≥≤L≤y(
m{hλ∞⎇→<Y-≥H_X.%*+β!$λλ~-n⎇→8,D≠yH∧∞Y=≥.-Z;Yd
]<⎇∧∧→[{d
=λ≤L↑≥<[N4λ_(ε5;~<nDλ
→M⎇h≥z↑Y:;D∧_X<E∃Hλ∩,a"Hλ∧∞≤X8lT→Z;LNh_(∞NX8y$∞|→8d
=λλMy<{D}λ≠~-<+λ~-n⎇→8,D≠yH∞M→(→N]X⎇~-⎇I|h∧
X;9$
=β"D∧λ≤Y.N<[\d(≠~.>λ≥z
}y(_l≡H~<dπhλ_-lλ≥z
}y(_lNH~<d;H→..[|H
\<|x,|+Hλ∧
~→(↑\[|AQHλλ
\<|x,|<h_.,.C"AQJ∂h∞⎇→<Y-≥H→[mu(λ≥∞,8y(=⎇;→
d⎇λ→M≥Yλλ≥H→>∞∞Kλ→L←≤≤K∧
|H≠,≤|[h∞∞[|→..≡(λm|H≥
#"H∧∧λλλ∧∧λλλ∧∧λλλn;X⎇
≥{H≤n8z9M≤9λ_O∀≥~→$∞z→<L];H≠n∞~;{Ea"C"Eπh_<L}→≠λm{j(∧
~→(∧
=→;$[{≠
}z;Yd∞~→(≡Y|→
Dλ≠|∞M;{H∞|<h≠M}λ_(∧
[{K-m;λ_.M{:8aQHλλ∧∧λλλ∧∧λλλ∧∧λ≤}-\[{AQC"Jπt→[{d∧≠[⎇∧];XnM;{J$∧∩;Y
≤x=→.4λ≥~≡λ≥~T→];L>~;{D∧≤|→,=9Z9,D≥≠h,(λ≥∞,8y9∧∞x<c!$λλλ∧∧λλλ∧∧λλλ∧∧≠[{E\=≠{-≤kλ≠n$λ~_,D≠[h∧];XnM;{X-D≤≤[n<]≡%dλλ
l;~9∧];XnM;{X-A"Hλ∧∧λλλ∧∧λλλ∧∧λλ≤∞-|→<NM9<h≡Y(→/∞≤Kλl>≤≤ED≤⎇8N%λ→\n\\Kλ
N⎇8\ED_;Y∧
88|MuJ#"AQJ∂hm{j(∧∧λλλ∧∧λ→[mt~<h
m⎇λ_$∞X;~,D≠|≥
≥{KC!!"Hλ∧
~≥<d(≥<lT≠yH∞NX8y$∞⎇8z∧<c"AQHλλ∧∧λλλ∧∧λλλ∧∧λλλ¬∞e (foo wherein (nil)) (bar argpdl nil))
would Return, without setting up any traceq,
((? wherei@8@Q]S0RR@P|ACeOAIPA]%XRR~(~∀
∃ACGJ@LZfp@@@@@@@@@@@@@@@@@@@@@&fZb8j\f@@@@@@@@@@@@@@@A ∃GKKE∃`@lXbrnn4⊂_TU Iβ
(T(@@@@@@@@@@@@@@@@@@@@A)QJ↓'sgi∃Z@@@@@@@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀@@↓∪LAs=j@ACQiK[aPAi↑AMaKGS→r@Ai<AieC
JAB@↓Mk]GQS←\A¬YeKC⊃rAEK%]N@AQaCGK⊂XAie¬GJ~∃
CYYf↓k]ie¬GJAE∃M←eJ↓gKii%]NAk@AiQJA]Kn↓ieCG∀X@A∪_AC\A∃ee←d↓←GGkIfX@A
CkgS9N@P}4∃g←[∃iQS]≤RAi↑↓EJAe∃ike]∃HXAi!JAMk9GiS←8AM←d↓oQSG AiQJ↓Kee←HA←GGUeeKH↓[Cr@↓←dA[¬r~∃]=hAQCYJAEK∃\Ak]QeCGK⊂\@A¬∃oCeJ∧~∀~∀@A∪h↓SfAa=ggSE1JAi↑↓GCYX↓ieCG∀AoSi A]↑A¬eOk[∃]if\@Qie¬GJRA∃mCYk¬iKfAQ↑@AB↓YSgh4∃←LA¬YXAi!JAMk9GiS←9fAGkIeK]i1rAEK%]NAiICGKH8~∀~∀@Ak]QeCGJ↓SfAkMKHAi<Ak]I<AiQJAKMM∃GifA=LAie¬GJAC9HAeKMi←eJ↓Mk]GQS←]fAi↑AQQKSd4∃]←e5CXXAU]ieC
KHAgQCiJ\A)QJ↓CeOk5K]hAQ↑Ak]QeCGJ↓M←dA∧AOSm∃\AMk9GiS←8@AgQ=kYHA J~∃o!ChAiICGJAIKike9KHAM=d@ASPvAR]∀\ASL↓ieCG∀@AeKQke]K⊂AM←↑0AkgJQk]iICGJ@↓M←↑RlASL~)ieCG∀AeKiUe]KHQM←↑↓oQKe∃S\AE¬dRAkMJ@Qk9ieCG∀@QM←<AoQKIKS\A CdRR8@@Ak9ieCG∀AoSY0~∃iC-JA[k1iSaY∀AgaK
SMSG¬iS←]LXAJ]≤\@Qk9ieCG∀AM←↑↓ckkpQECd↓oQKe∃S\@A CtRA→kaQ←<R\~∃
CYYS9NAk]QeCGJAoSi A]↑@↓CeOk5K]if↓oSYX↓k]ie¬GJ@A¬YXAMU]GiS=]f@A
keeK9iYrA KS]N4∃ieC
KH\~(~∀@@↓eK[iICGJXA←II1rAK]=kOPXAKqaU]OKfAiQJ↓K]iSIJ@AiICGJAACGWC≥J\@@↓∪h@AQCWKf↓]↑~∃¬eOk[∃]if\4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∃ ∃GK[E∃d@lXbrnn@@@@@@@@@@@@@@@@LfZb\T\f@@@@@@@@@@@@@@@@@@@@@AACOJ@LZfr~(_TU Iβ
(T(@@@@@@@@@@@@@@@A5CGYSM`A%K→KeK]
JA≠C9kCX@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀b\T\h@AQQJA'QKaaKH~∀~∀4∀@@AQQJ@A1∪' @EgiKAaS]NλAaCG-COJ@↓Sf@A%]iK]⊃KH@AQ↑AOSYJ@Ai!J@A→%' @AAe←Oe¬[[Kd↓B~∃M¬GSYSQrAC]¬Y←O←UfAi↑AiQJ↓∪]giIkGiS=\A'i∃`A[←⊃J@A←_Aek]9S]NA∧@A[C
QS]J↓YC]OUCOJ~)ae←OICZ\~(~∀@@@@@@@@@@@@@@@@@@@@@@@@@AQQJA%%GPA'QKaaKH~∀~∀@A)Q∀A%SG AgiKAaKdAACGWC≥J@AaI←mSI∃fABAMS[aY∀XAg[¬YXAI∃EkOO%]N@A
CaCE%YSir8@A∪h4∃SfA¬mCSY¬EYJA¬fABA1SEeCIrAae=OeCZ↓S\Ai!JA∪)LAS[a1K[K]QCiS←8\~∀~(α1⊃←\Ai↑AUgJAi!JA')∃ A
C
SYSid0α
∀4∀~∀@A)QJ↓aCGW¬OJAG=]iCS9fAio<AG←[ASYKH↓Mk]GQS←]f↓oQSG ACeJ↓YWCI∃HAEr4∀~∀@@@@@@@@@@@@@@@@@@@@Q→CgY←¬HAgi∃`AMCMXAIg,AYSE1g`R~(~∃)Q∀AkgKHAS]i∃eMCG∀ASfAQQe←k≥PAiQ∀AMk]
iS←\QMKqAdRAgQK`XA]QSGP↓gKifAgoSQGQKf↓i↑~∃AkhAi!JA→∪M AS]QKeae∃iKdA%\AC]⊂A←kh↓←L@EMiKaa%]NDA5←IJ\A)QJ↓ECgSAG←[5C]If↓CeJt4∀~∀~(@@@@@@@@@@@@!giK`↓hR@@@@@@w)ke8A←\AMiKaa%]NA[=IJ\~(@@@@@@@@@@@@!giK`↓]SXR@@@@w!ke8A←ML↓giKaAS]NA5←IJ\4∀~∃)!KgJA
←[[C9IfACIJAkgUCYYr↓isaK⊂AChAQ←`AY∃mKXX↓C]HA]SYXAQCWJ@↓KMMK
hAS[5KISCQKYr~(QR]J8AiQJ↓]Kqh↓&[KqAeKgg%←\AieaKH@↓S\Ao%YPAE∀AKmC1kCiK⊂AS\AMiKaa%]N@A5←IJR8AβYg<~∃-N0AS\A¬IISi%←\Ai<AeKiUe]S]≤Ai↑AQ←`AY∃mKXX↓ike]LA←ML↓giKaAS]NA5←IJ\4∀~∀@A∪\AMiKaa%]NA[=IJXAQQJA→%' @A∃mCYk¬i←dA]SYXAAeS]h↓←khA∃CGPAL[KqaIKggS=\@Ai<AEJ~)KmCYUCiKH↓EKM←IJ@AKYCYkCQS←\X↓C]HAQQJ@AIKike9KHAm¬YkJA¬MiKdAKmC1kCiS=\XAG¬YYS]≤~∃CiMKYLAIKGkeMSmKYdAi↑A⊃SgaY¬rAiQ∀AgiKAaKHA∃mCkY¬iS←\↓←LAK¬GPACIOk[K9hXAS_AiQJ↓&Z~∃∃qaeKMgS←\ASf@↓B@AMU]GiS=\@AG¬YX\@AβMi∃d@AI%gaYCeS]N@↓KCGPA&[KaaeKgMS←\XAiQJ4∃KmC1kCi←HAoSY0AoCSPAEKM=eJAKYCYkCQS←\A→←dAB↓G←[[¬]HAG!CeCGQKdAMI←ZAi!JAG←9g←YJh~∀~∀4∀@@@@yga¬GJ|@@@@@@@@@Aπ←]QS]kJ↓giKaAS]NAIKGkeMSmKYd\~∀~(@@@@yekE=kh|@@@@@@@@@↓'Q←n↓eKikI]KHAYCYkJ↓Me←Z↓iQSf↓YKmK0A←]YdX@AC9HAG←9iS]k∀~∀@@@@@@@@@@@@@@@@@@@Agi∃aaS]≤Akao¬eH\~(~∀~∀4∃!CO∀@fZh@@@@@@@@@@@@@@@@@@@@@@@&f4b\j\P@@@@@@@@@@@@@@@@↓ KGK5EKd@XX@br\n~∀_TU Iβ
(T(@@@@@@@@@@@@@@@@@@@@A)QJ↓'sgi∃Z@@@@@@@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀@@@@yGH|A←dyiCDx@@@@@A)kI\@A←→L@AgQKaaS9N@A[=IJ\@QEkh@AG←9iS]k∀@AKm¬YkCi%←\~∀@@@@@@@@@@@@@@@@@@@A]SiQ←UhAgi∃aaS]≤R\~∀4∀@@@A @@@@@@@@@@@@@@A%KI%gaYCdAGkeIK]hA→←eZA%\AMk1X@QR9J\@A]SiQ←UhAae%]YKm∃X~∀@@@@@@@@@@@@@@@@@@@A←HAaeS9YK]OQPR~∀4∀@@@A∧@@@@@@@@@@@@@@A∂Kh↓EeKC-a←S]PvAae=GKKH↓oSiPI ~∀4∀@@@A~@@@@@@@@@@@@@@A'KJ↓CImC9GKHA→KCikIKfAk9IKdAMiKaa%]NA≠¬Ge↑A∃qaC]MS←]f8~∀~∀∧1≠←e∀AβIm¬]GKH↓
KCiUeKf0∧~∀~∀4∀@@AMKYKGQSmKYdAike9S]NA=\Agi∃`t~∀4∀@@@@@@@@@@@@@@@@@@@@@@@@Qgi∃`AM←<bAM←<d@\\8R~∀~)∪LAi!SfAG=[[C]⊂ASfAQsaKHAChAQ←`AY∃mKXX↓giKaAS]NA]SYXA9←h@A
←[[K9GJAS5[KIS¬iKYr0~∃EkPAeCi!KdAo!K\Ai!JAKm¬YkCi=d@AM%eghA∃]G←k9iKef↓BA&[∃qaeKMgS←\↓oQ←g∀AGCdASfA=]J~∃=L@AM=↑bXA→←↑dXAKiF8@@A)!SfAM=eZ@A]SYXAQQK\@↓ISga1Cr@A¬hAiQ∀@AG←9g←YJ0@AC]⊂AiQJ4∃KmC1kCi←HAoSY0AEJA%\Agi∃aaS]≤A[←I∀AoCSQS]NA→←dAB↓G←[[¬]HAG!CeCGQKd\~(~∀@@↓'iKaAS]NA5CGe↑↓qaC9gS←]Lt~∀~(@@A∪_AiQJ↓giKaAKdASLAae←
KKIK⊂AoSi AB@yMaCGJxXASh↓oSYX↓]←hAMiK`AQQJAKaKGki%←\A←_~∃[C
e↑AKaaC]g%←]fX↓EkhA]SYXAICiQKHAUkgPAgQ←\AiQJ↓eKgk1hA←L↓iQJA5CGe↑↓←LAKaaC]g%←\~∃¬]HAo¬ShAM=dAC]=iQKd↓G←[[¬]H\~(~∀@@↓)↑Ag∃JAiQ∀AKqK
kiS←8A←LAQQJA[¬Ge↑A∃qaC]MS←\A%igKY_XAae=GKKH↓iQJ@↓giKaAKdAo%iP~∃¬\A~A%]giK¬HA←L↓B@ygACGJ|8~∀~∀@A+g%]NAgQK`Ao%iPAEIKCWa=S]ifh~∀~∀@A)Q∀ACE←YJAIKMGeSaQS←\A¬aaYS∃fAi↑↓ike]%]NAgQKaaS9NA←\↓C]HA=MLAO1←ECY1r@ACPAi←`4∃YKm∃X\@A5←eJA⊃KiCS0ASfA9KGKgMCerAQ↑Akg∀AgiK@AMYKaSEYr↓S\AC9HA←kP@A←L↓EeKC-a←S]Qf~∀Q∀]N\AQ←OKi!KdAo%iPAiICGJR8~∀
∀@A∪L↓giKaAS]NA%fAikI]KHA=\AErQgiK@AhRA¬hAi←@AYKm∃XXAi!JAKm¬YkCi=dAoS1X@A≥=(AEJ4∃S\@↓giKaAS]N@↓[←IJAoSi!S\@A∧@AEe∃CWa←%]hAY=←`\@A∪L@↓s←j@↓oSgPAi↑@↓kgJAMiKaa∃H~∃KYCYkCQS←\@↓oSiQ%\@AB↓EeKC,@AY←=`@As=jA[kMh@AiUe\@A%hA←\AY←G¬YYb@↓Er@@!giK`↓hR\~)π←]m∃agKYdXASL↓giKaAS]NA]Cf@A9←hAiUe]KH↓←\ACPAi←`AYKm∃XAC]⊂AShA%bAikI]KH@↓←\AEd~∀QgQK`Ah$AS\A∧AEeK¬VAY←=`XASPAoSY0@A≥∨PAEJA=\AoQ∃\AeKQkeLA%bA[C⊃JAMe=Z@Ai!JAEe∃CV~∃1←←`A r@I 8~∀
∃⊃KGK[ Kd@l0@brn\@@@@@@@@@@@@@@@@&fZb8j\h@@@@@@@@@@@@@@@@@@@@@↓!COJfZhb4∀**DRAFT** Maclisp Reference Manual **DRAFT
*
Hkwever, executing (step nil) inside a break loop will turn off stepping
globally, i.e. within the break loop, and after return has be made by $P.
The most useful feature iS the following, however:
(step) Command at top level has no immediate effect.
After (step) has been executed at top lEvel, a subsequEnt (step t) inside of
A break loop will have the effect od turning on stepping mode both inside the
break loop and globally, i.e. the evaluator will start to step as soon as the
retqrn is made from the break loop by $P. Thus, for instance, one could set
trace to break at some special place, and then use the break to turn on
stepping.
prinlevel and prinlength:
In the present version, for convenience, prinlevel and prinlength are lambda-
bound inside the hooking function to 3 and 5 respectively. These could be
changed by editing the expr code and recompiling.
When the P command is used, prinlevel and prinlength are temporarily bound to
nil, and the toplevel printer (the value of atom prin1) is used to redisplay the
current form.
Overhead of Stepping:
If stepping mode has been turned off by ↑g, the execution overhead of having
the stepping packing in your LISP is exactly nil.
If stepping mode has been turned off by (step nil, every call to eval incurs
a small overhead--several machine instructions, corresponding to the compiled
code for a simple cond and one function pushdown.
From an overhead point of view, running with (step) entered at top level is
the same as running with (step nil).
Stopping stepping by responding <tab> incurs the same continued overhead as
(step nil).
RuNning with (step foo1 foo2 ...) can be more expensive, since a member of
the car od the current form into the list (foo1 foo2 ...) is required at each
call to eval.
Page 3-42 ∪3-1.5.4 December 6, 1977
**DRAFT** The System **DRAFT**
In terms of memory requirements, the total compiled stepping package occupies
about 423 words of binary program storage.
Interaction with debug and trace:
No special interactions of the step package with debug, trace, or any other
system packages are known.
The Morgenstern Stepper
The Morgenstern Stepper package provides debugging capabilities for
interpreted LISP programs that are comparable to the capabilities provided by
DDT for assembler code. These capabilities include:
1) Single stepping through the evaluation of a function and over or into other
interpreted functions, when called, on a selective basis as determined by
the user. Each such form and its resulting value may be displayed.
2) Dynamic breakpointing on one or more of the following conditions: the form
or atom about to be evaluated matches a pattern you provide; the form being
evaluated involves a specified function; a given atomic symbol evaluates to
a given value; a given atomic symbol is to be bound in a prog, either type
of do, or an eval'd lambda-expression; or upon an arbitrary condition
specified by a predicate written as LISP code.
3) Returning a different value for a given S-expression. This allows for
changing the action that would be selected by conditionals in the program
and/or by go's in a prog or do. You can also go to any tag inside the
current prog.
4) These capabilities may be requested when the program is initially started by
a top-level form, or they may be initiated at any other point in the course
of execution - either from the terminal while in a breakpoint, or directly
by the program.
The stepper may be invoked initially by using the function mev as one would
use eval of one argument; e.g. (mev '(fcn arg1 arg2)). From a breakpoint op in
a program, the stepper may be turned on by invoking (hkstart) with no argumefts.
It may be turned off by the q command described below, or of coursE by a CTRL/g
December 6, 1977 ∪3-1.5.4 Page 3-43
**DRAFT** Maclisp Reference Eanual **DRAFT(T~∀~(~∃Ee∃CVL@↓βEiKHA[Kl↓KmCYUCiKf↓SifA¬eOk[∃]hXA%hAeKQke@;~βS#∃π3π3W*βπ;⊃¬#WK≠~β?≠→π##∀4Tε7&/∞W∩r∧ f␈&T∞FF∂D ⊗rα∞Mε*ε≤-w6*X∞≥<≠⊂∩H:42P→4πrm given ac an areume@9h@Ai<A[Kl4∃`∨π~βGW∨&+⊃9↓∧K⊃1β≡e "∞Mε*πl≥G.(≠qDH≥x.∀≥~→$
hεr`8pression (dcn arg1 arg2 , then
∃←9JAG←UYHAkMJ@@#n+Yβ→Jβ';O&+π"aQ hR∧∧∧∂"∧λ⊗wJ∧
ε}NnDε'∂-→f*α∞Mε*α∞8
↑≤~3LUλ≠p↔→P⊂6p↑P⊂4g≤βpec@PAaQJAeCYUKf@A=H β?&C↔H∀Tεf∂⊗α88ML<kλ≥Yλλ↑Y;@⊂≤αea`Ply mev to a`≥r↓IP∨Khq↓↓α&C'Mβneβ*↓β∪?v)β'→αβ↔'SF+Aβ?0h#@&∞,V*π|∨↔
R∧λV∞≡∧λλm⎇98;LD≥z3
D_Y(∞∞Y{<∞L9λ⊂∪≠y⊂1<H↔SV⊂≥yzpv≠<P3 /lh ←o%]NAi!JAYCMh∩+4{@⊗J∞
&NwLXBε←↑Abα∧≥o∩¬~\X∞∞∞Y<tm≥{H⊂~~0z⊂⊂~yP:<\2r⊂ 7hich↓SfA]=hAeKα≠?∨;Lπ&.α∧λ↔4_#"L={;8-lλ≥z-Mα⊂12H2{0v p⊂∀;Zz44`. af @∃`KO,εBπ&tλλl≡_z⊂→y97`2pεR\@↓βYiKI]CiSYKYbX↓iQJA∀~∃G←5[CMHαβS :X
L≥λ_;O∀λ→0≤≤92y`3ion, or the h Comeand to get a ni@
JAisββ∃↓β|∧b∧≥J)B`=β"P⊃≤2puGλ⊂⊂"4~yP4iH92pv≠<P0@ APRL/b break$ But i@PAkgK⊂Ai↑A JAπ)I_←PAM↑@Ai!JAG←5[CMH4∃QCAAK]fAQ↑AEJ↓GCYY∃HAP\$~∀
∀@AS\↓iQJA%if@A%[aYK5K]iCQS←\A∃CGPA
←[[C9HA[kMh@AE∀AM←Y1←oKH↓ErABAgaC
J@Qk9YKgf4∃iQJ↓G←[[¬]H@A%bAB@↓YSgh$\@AS8AiQJA[kYQSGfA%[aYK5K]iCQS←\@↓KCGP↓G←[[¬]H@A5kghA J~∃M=YY←o∃HAEr↓BA]K]YS]J8@ACGQkCYYdXAiQ%fAIKnmode). each form and result which is printed out will be followed by
#number indicating the relative level of evaluation (i.e. stack depth since
invocation).
the primary commands are:
d (mnemonic for down) go down to the next deeper level of evaluation and
display the first form there before evaluating it. e.g. if the form is a
function call, this will display the first argument of the function if it has
arguments in the call; otherwise it will display the first s-expression of
the body of the function. it then prompts for the next command.
e (eval) can be used to evaluate an arbitrary expression. it starts a new
line, waits for you to type the expression, then eval's it within an errset,
and prints the result. this is comparable to just typing the expression or
atom after the //, but cannot be confused with a command, and the format is
nicer.
h (control-h) enters a break loop, and when $p'ed displays the current form.
within the break, one can inspect the values of variables, etc., and even
reapply mev to any form.
n (next) Display the next form at this level, without showing or inspecting the
evaluation of the lower levels of the current form. The value of the current
form is displayed first. If you wish a condition to be tested for at lower
levels, use nn instead.
Page 3-44 ∪3-1.5.4 December 6, 1977
**DRAFT** The System **DRAFT**
nn Like n but slower since it inspects the lower levels. Use instead of n when
testing for a condition.
u (up) Go up to the next higher level of evaluation and show the next form at
that level. The form(s) at the current and lower levels are evaluated
without display. As an example of its use, after you have seen the
evaluation of the arguments to a function, the next form to be evaluated, if
the function is being interpreted, will be the first S-expression of the
function; to avoid seeing how the function is evaluated internally, you can
type u. Note that the lower levels are not inspected - thus if a condition
is to be tested for at these levels, use uu.
(u num) If num is positive (or zero), forms are not inspected nor displayed
until level num is returned to. If negative, it goes up (abs num) levels
relative to the current level. Thus (u -1) is equivalent to u.
uu Like u but slower. Use if testing for a condition.
(uu num) Like (u num) but slower. Use if testing for a condition.
q (quit) Exit from the stepper.
s (show or display mode) For datapoints and other display teriinals, this
gives a niCe easidy read output od∧@Ag∃YKGi∃HAYKYKYf@↓iQChα↓β∂?w≠S'S,εF*πMPhR∧∧ε≡}nLWGλλ≠l@⊂:42H⊂1zi≤2w:⊂→{0v:Xz4ww⊂⊂⊂)\2qts~qpv&≡T∧ iT seLects the current
level fOp sp@IS]hO%]N@QAeKiIdAaeS9iSMNαI↓βπ~β¬↓F+π&↑ "bε≥lBε∂4⊗␈*∧vzεLXWε/%APBα∧λ
(≠⊂↔Xpp @
←]iKah@ASLACEEIKm@'∂#∃'C⊗K;@&\@λ∞]Y→0→λ⊂:44\P42`!der, and the CurreNt ∀@AWkiAkhAo%YP⊃β⊗)βOC⊗K;A∨,!1↓β~β7πe∧∧&*π↑8 ,D_8h
|]→3D<h⊗-}(≠⊂∀Zβa. Headers @]SYX~(@@ACUiW[CQSGCY1r@AE∀Aa←AAK@@Aβ;#↔→¬K?U↓¬∪↔SW⊗q0∩α
Mε*α8m]8;Y∧¬≤hλ
n9*(∧∞y;⊂∩Xz9P CE⊂⊂⊂≤0y0∀icudar le@YKX@A¬`
β¬αβ#↔π&+I9↓αα'Qβ∞s⊃↓β&C∃↓β≤¬vnn≥lBπ≡d∧ε∞vD∧π<α{2`2al u@MKd4R↓↓βO,εG&∞-H $∞_8X-\αz2`2pεAC@⊗)β∪↔≤≠@⊗N,XBεNβH⊂~~2P6w\αe deta`∪Yα+⊃βO,∧7&Nβ{@⊂_2r7`7,∧⊂∀!Q"C@(≤k,←≤
(∧∧∃~→$
hεr`8pres@MS←\@↓SfAgβ+OSLεG/&\@λ∧Xπq the cur`%∃]`⊃β4¬w-αP⊂ !nd anothe@H~∀@@↓G←[[¬]HASβ→βCK|¬Wπ→9⊂→αh∂d@!RP≠∃p∧πN␈Tλλl≥Hλ⊂→]2x⊂ )npo @=` β?αh .⊂:42H52{@ d¬P∨Kh∧αεNd⊗␈(Q$ααπ|≥g"πMu∩`$λ⊃z]H≥~T≤Y4n]≥~3LT≥X;∞\αP4`3 retupjed↓ShAo%YP⊃β⊗)βπM∧¬⊗ $≥~→$
|Z0∪Zw0vεB⊂⊂⊂ &ore Ha`λAsαK↔3∪,!βC#∂!βKπe+∃ 2∧λf␈∩X∞≥<≠⊂∩K⊂8wjH1pw change the ap@ACeK]PAaeKβ# ($∧αε←$λ L≥≤z0~≡P7s⊂≤92r4Xpz2yH⊂7q_<x0y\P0P∀→wP⊂&_q2v∀K⊂0yP≥p¬dl as Just @IKike9S]N~(@@AI%H≠↔⊗+;Aβ43@.↑4ε6@|H⊂⊂[⊂)Vr↑892i\tp∂n∞
~∀!G←]HX 99J↓αS↔∨#@~αiwαε=xLM=~;mnh≤∀M≥|H∃
tλ→=L≥≥8=
≥{H≠l@⊂2pqZ⊂3:j≥y2P⊂→5y6Fλ0s2εB⊂⊂⊂;Z2w⊂9Xz4ys~rr⊂+Zv6⊂8≤4w:⊂_P⊂6r\ypsrK⊂24y\60tP≥42P3≠y2V⊂_w2⊂;Xtz⊂⊂→5y⊂0[7z42\εA⊂⊂λ1wvvXw2⊂∀≥t4qtλ6p|P≠s⊂1g]y9rP_2P4→5y⊂ H192pZTW⊂⊂∃42P0\3zvr[:⊂:7H:44yH1ww2λ4yFEβEαE"→qrvq→y⊂≠⊗λ_\[[H⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∧YVXW
W~⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∀0srPVZ~FBβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂&Xqv4y\⊂)2s→y2w1YP&pw≥pv⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*∃
εEεEβE⊂⊂⊂_w⊂⊂0\14z9_y<P)Kr|89→yytw[⊂⊂7yλ9|vq≠v⊂⊂;Z4qt⊂~yP⊂2]0v:p]2r⊂6~urP⊂_P892Y4qpz→WεE⊂λ⊂*44\P4yP≤tvtv_y⊂:7H:42P_ww2⊂→2pz:\2P7sλ:42P≥90qrH80quXsrWεBεE⊂⊂λ$w⊂9\2qts≡tw3P≥42P8≤2r4qXz2V⊂≥42P⊂→7y6P_q7zzλ:7P1→P2{0[:pz2Y⊂6p|H⊂12P≠q:0t[2rεEλ⊂⊂0yH:42P≥0v:rH7s⊂:~2P;0\4pq6→P∩Rs≠y6W⊂λ*42P→|892\ytwwλ∀47wZv2{2[∀P⊂9→z:y7≤P:42CE⊂⊂⊂≤2v0z~{2P6→{2v⊂≠s⊂2{_v:pz~ww↔⊂λ&wy2H:40wλ7w2P≤92r4Xpz2P≠p|P1→P3t{→w⊗⊂4[⊂;t4XtεE⊂λ⊂1pyYP:42↑P0y2H7y∪rY⊂:7sYz42y⊂⊂2|_rx:⊂≥t2w⊂≥;wP0\3zvr[:9P3≠y6P0H⊂9x2Xtpv⊂≥2yzεB⊂⊂⊂0\P22yXy4q2Y⊂4w⊂≥42P6[y2P⊂→2z0t[2r⊂9Yqz4w[⊂12v≠{W⊂⊂∃42P1[w24z~ww⊂⊂≥tv6⊂≤2vpt[εE⊂⊂λ0qz4]2P⊂0]⊂0v6λ⊂62{→v9P:~0z⊂⊂_y2P4[9x2q]2r⊂⊂_<P:4→P⊂9z→x82yλ⊂:w:~v⊂2|≤64qt]6<FEλ⊂⊂::\72r⊂≠s3⊂1≡P∀1w[2⊂74[∀WεEβE⊂⊂⊂
6pz1Z3⊂↔↔∀P4yH0P3:[1z4w[⊂;t4Xt⊂;t[6⊂80]:2y7λ6pz1Z⊂0spZw9z⊂≥42P1]y92w≥⊂37y≠WεE⊂λ⊂$z⊂≠p|P1→P:yrY⊂4w⊂≥42P8≤2r4qXz2P7Y⊂:42H1ww2⊂⊂∀ [9wP9YrP4z≤P92v_z2r⊂≥yrP⊂_yP0FB⊂⊂⊂1[vvpw→↔∀P⊂∃42P0\3zvr[:⊂⊂:≠P6pz_t3⊂4\P1wv\0y2rλ⊂:7P Rs7y≠P2v2[rw:⊂λ1<P2[2vrw≥εE⊂⊂λ397vH62s:λ:7P9~st:⊗λ0w2⊂λ9zqqYrr9P≥t2w⊂→pqt⊂→v2vr[:⊂7sλ:42Pλ80z:→y7⊂9]qqrrY9WεEλ⊂⊂'sλ⊂4vx≠y:0w_rV⊂:~2P⊂8_sively to sublists, unless the
sublist is of the form (# ...) in which case # is bound to the current
element of %%form and the cdr (not cadr) of the #-list is evaluated as the
test on that element. Except in this case, atoms and lists should be given
as in the original code since they are not evaluated. Some simple examples
are:
(matchf xyz) succeeds if the atom xyz is about to be evaluated.
(matchf (setq alpha)) succeeds if the atom alpha is about to be setq'd.
(matchf (putprop name * 'source)) succeeds if the property source is
about to be putprop'd on the atom pointed to by (i.e. the value of)
name.
(matchf (setq (# member # '(alpha beta s3)))) succeeds if either alpha,
beta, or s3 is about to be setq'd.
(matchf (rplacd * '(* 9))) matches (rplacd (last urlist) '(2 9 4)).
(matchf ((# member # '(foo bar)))) succeeds if a function call to either
foo or bar is about to be evaluated (more precisely if the car of the
form about to be evaluated is either foo or bar).
nil (cond nil) turns the condition off and saves the current non-nil condition.
Page 3-46 ∪3-1.5.4 December 6, 1977
**DRAFT** The System **DRAFT
*
(cond) When no argument is given, the last non-nil Condition (which is the old
property of %%cond) is established as the current condition (whiCh is the
value of %%cond). (Id∧AiQ∀AaeKYS←kf↓G←]I%iS←\↓oCfA9←hA]%XAiQ∃\ASh↓SfAg¬mKHA¬f~∀@AiQJ↓←YHAAe←aKIirXAQQkfA¬YY←o%]NAM=`ACYQKe]CQS←\A=H βS>yβ∂?v#'S'}sM9$hP4)#nS∂#2↓999Jβ'Mβ/W'[∞c↔;Q¬#=↓β≤{;⊃↓FkπS∂F1↓99rI%1β≡+∃βπ⊗{[∃8hP4(∧E##∃β4{33?>K;≥β7+;∂SN{;Mβ∂∪∃βW≡+∪G1∧¬⊗rε=xMl8⎇~-⎇H≥z.Mλ≥~T≤⎇→.∞→<F∃A"C!$λλ
|⎇_..λ(⊂≠Zv6⊂4[4z4p]2P9z→x84g→P;t2[⊂2w1[zw:2\2r⊂$[⊂0P 0rogbam or tq`Ed from
αabreakpoint,∧@@Q!Sgi←@RAoS1XACGPAYSW∀AiQJ↓bAG←5[CMHαβS :∞NWεr
xf $λ≤u↑≤~3LuH
⊂-N{c"N<αrP!→v7{P→4πr More Info.$~∀4R↓↓↓βn∪π-∀λ
.P⊂0@→8s1`4ion To be qse@⊂AYSW∀@AiQ∀A→∪'@AgcGβ#↔5∨~↓↓#∞[3'O I0∩α¬
V⊗∞5⊃PW∨N-↔π~
}W"εn-vjπMRπ⊗↑8
-Nα⊂7`& (baklist$AaQ←β≠∃β≠,s∂S'|s@~πM↔"ε≡f*πMtε&Z∞⎇↔&B∞Mε(hα\p~→x82`2,∧∩(hQ↓↓α&C∃βK,kπ'lLW$λ≠qD∞~~0→H9rq`4ion is a↓G←[a1KiJ@↓YSghαβ?2∞Mε*αλ8
↑≤→0→λ1wvvXw29VβE;t4Xt⊂1`!n be used↓H ?$λL\β2y2[1rWεB∧@
Commandc whicH are nkt @1Sgif↓[kgh↓EJAMα{3#?>+⊃βJβ¬βO∧∧⊗≡
d∧¬N␈Tλλl≥H≥<lT≤Y0⊃≠zzεE_2s7`2e co@5aP∪↔&K;≥β&C∃β∂|¬Vn∞l@λ¬8π2 its Space i`A]∃G@↔O≤∧↔/*+@⊂λ⊂ v 4er`≥CQSmKYβI1β@≥zPhVβ8>$8[p→≥⊂:42H1wvvXw2⊂ "ebg`%∀AG←[AYKiSαs⊂~ε≤@ε↔JMvNvtλλ$λu∀S¬@|⊂19→pqWεB∧@
Afy S)express@%←\Ai!ChAs=jAiSAJAoQ%GP@A%`
β;⎇!βK↔≤{↔;πT∧V"ε≡4ε
ε=x-\9Y⊂λ;tv , be
evaluatedQgSi!S\AC8AKeeMKhAi<AGCI
PAKeI←efR8@A)QUbA`'␈)β∂πpβ↔[πg+πS∃ε;eβ∂#?5β|ε hVMtε∞w∀g.v>M⊗}r8λ-Mλ≤z-↑≠≡(/(λ≥∂≡~;Yd
=λ⊂∪≠v67{Zw3P:~2P89≠vx:4[3P↔WH0yP⊂≠5w3P_yFE )t is not @%]iKeAeKiC YJ@A¬fA←]∀A←LAQQJAG=[[C]⊃f@AE∃Y←n@!←dA]%XR\@↓≥WiJAiQCPAs←J4∃GC\↓CGik¬YYbA≥↑Ai↑ABAi¬NAoSQQS\Ae←kdAAe←N@↓gS[a1rAEr↓isaS9N@QO<AiCN$@ACMQKdAi!J~∀↑<\@A)<AKmC1kCiJ↓BAM←IZAoQ%GP@A1←←Wf↓YSWJ↓BAG←5[C]H0Aisa∀@Q←d↓MWeZ$@Ai↑↓KmCYUCiJ~)ShXA∀]N\@!←dAB$AKmC1kCiKLAiQJ↓Ci←Z↓B\@A%LAs←TAoC]PAs←j↓GC\A∃mK\@↓oeSi∀AMk]
iS←]L~∃oQ%GPAW9←nAC ←khAQQJAgQKaaKHAC]H↓ieKCPAiQK4ACfA
←[[C9If\~(~∃B@@@QC1XRAβUi←[CQSGCY1r@AI%gaYCefACY0AM←e5fAC]⊂@AmC1kKfAMKK\A rAiQ∀@Agi∃aaKd↓Ch~∀@@@A¬YXAY∃mKYf8@A)sAS]NA∧AgaC
J@ACPAC]r↓iS[J↓iQKe∃CMiKHAoSY0AGCkMJ@Ai!JAgi∃aaKd4∀@@@Ai↑A1KCmJ↓iQSf↓[←IJ↓C]HAAe←[aP@AM←HABA]∃nAG←5[C]H8@A∪L↓s←jA]C]h@↓iQJAMiKaa∃d~∀@@@Ai<AoCSPAM←d↓BAG←5[C]H↓CMiKHAKCG AM←e4XAs←TAGC\↓kgJAQQJAH↓G←[[¬]H\~(~∀@@@Aπ←5[C]ILAB@A¬H@QBZR@AAC]H↓GF@AACkgJ↓CMiKHAKCG @A]K\AM←e4ASf@↓ISga1CsKH↓SL~∀@@@@∀KCF[MYKK`↓SfA]=\[]S0\@A∪QfAmC1kJASLAkgK⊂ACfAQQJAg1KK`AQS[JA%\AgK
←]If8~∀~∃¬H@@@!CYXA⊃←o\R↓βki←5CiSG¬YYrA⊃SgaY¬sf@A¬YXAM=e[fA¬]HAm¬YkKf↓K]G←U]iKe∃H@AEdAiQJ4∀~∀~) KGK5EKd@XX@br\n@@@@@@@@@@@@@@@@&fZD\j\h@@@@@@@@@@@@@@@@@@@@A!CO∀@fZh\~∀_TU Iβ
(T(@@@@@@@@@@@@@@@A5CGYSM`A%K→KeK]
JA≠C9kCX@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀@@@Agi∃aaKd↓S\AKYCYkCQS]NAQQJAGUeeK]P@AM←IZ@QR9J\ACPAIKKAKdAY∃mKYf$\@@AQsaS]≤AB~∀@@@AMaCGJ↓aeS←H@Ai↑↓G←[a1KiS←8AoSY0@AGCUgJAi!JAgi∃aaKdAi↑A1KCmJ↓iQSfA[←I∀AC]H4∀@@@Aae←5ah@A→←dABA]Kn↓G←[[¬]H\@@QβYM↑@Ag∃JAH\$@@A'1KKaf↓CMiKH@AKC
P@AM=eZXA¬f~∀@@@AI∃gGeS KHAk9IKdAQQJAB↓G←[[¬]H\~(~∀QB↓YKlRAβki=[CiS
CYYr↓ISga1CsfA¬YXAM=e[fA¬]HAm¬YkKf↓ChAi!JAS]⊃SGCi∃H@AY∃mKXA¬]H~∀@@@A1←oKdQIKKAKdRA1KmKYLXAikI]S]N↓SigK1L@A←→LAoQ∃\AKm¬YkCi%←\Aa=afAi<@ABA1KmKX4∀@@@AoSi AB@AM[CYY∃dAYKYKX@A9k[EKH\@@AQsaS]≤@ABAMaCGJAaeS=dAi↑AG←[AYKiS=\AoS1X~∀@@@AG¬kgJAQQJAgQKaaKHAi↑A1KCmJ↓iQSfA[←I∀AC]H↓ae←[AhAM←HABA]∃n@AG=[[C]⊂\@@Q¬Yg↑~(@@@@↓gKJA⊂\R@AMYKKaLACMi∃dAKC
PAM←IZXACLAIKg
eSEK⊂Ak]I∃dAiQ∀ABAG=[[C]⊂\~∀~)D@@@↓'Kif↓BAEe∃CWa←%]h@AQ↑A←G
kdAC→iKdA∃mCYk¬iS←\A←LAQQJAGUeeK]PAM←e4\@@A¬hAiQ∀~∀@@@AEe∃CVXAQQJAm¬YkJAQ↑AEJ↓eKikI]KHA%fAiQ∀AmCYUJA←LJKmC1kJXA¬]HA[¬rAEJ↓GQC]≥KH~∀@@@A rAgKQbOS]≤AiQSLAmCe%CEYJ8@A)Q∀@AM←IZAiQ¬hAsS∃YIKH↓iQSf↓mCYk∀ASf@↓iQJAYCYkJ4∀@@@A←L@∀KM←e4\@A)eaJ@I@Ai↑AAe←GK∃HAMe=ZAiQ∀AEeK¬Wa←S9h\@A%LAs←TAaeK→KdAi!ChAi!J~∀@@@AgegiKZ↓oCSh↓eCiQ∃dAiQ¬\AEe∃CVAg∃JAiQ∀AoiS_AG←[5C]H\@QDA=aKeCQKf@A rACI⊃S]N~(@@@@↓iQJA
keeK9hAQ←=WYKm∃XAi↑@JKEIKCWY%gh\RA3←j↓GC\A≥KhACUi←[CQSF@A eKCW%]NACP~∀@@@ACY0AYKm∃YfAEdAkgS9N@Qe∃iG←]⊂AhRA=dAG←9ISiS=]CXA eKCW%]NACL@AIKMGeSE∃HAEK1←n~∀@@@A→←dAi!J@Qe∃iG←]⊂@\\\$AG←[5C]H\4∀~∃F@@@Q
keeK9hRAβUi←[CQSGCY1rAISMaYCsLACYXAM←e5fAC]⊂AmCYUKfACPAUkgP@AiQ∀AGkeIK]h~(@@@@↓YKmK0\@@AQsaS]≤AB@AMaCGJ↓Ch@A¬]r@AQS[JA⊃keS]≤@AiQ∀AISgAYCr@↓oSYXAGCkMJAiQ∀~∀@@@Agi∃aaKd↓i↑AY∃CmJAQQSfA5←IJA¬]HAaI←[ah↓M←dA∧A]Kn↓G←[[¬]H\@↓)QJ@↓giKaAKdAI=Kf~∀@@@A9←hAS9gaKGPAiQJ↓MWe[LA←LA1←oKd↓YKmK1f@ZAQQkfA%LABA
←]ISQS←\A%bAi↑↓EJAi∃giKH4∀@@@AM←d↓ChAi!KgJA1KmKYLXAkg∀@AGF8@@A'1KKaf↓CMiKHAKCG AM←e4XACfAIKg
eSEK⊂Ak]I∃d~∀@@@Ai!JABA
←[[C9H\~∀4∃GF@A→SW∀AFXA khAS9gaKGQfAiQ∀AY←o∃dAYKYKYf\4∀~∃GQ←N@A→YSaf↓iQJ@∀KG←]⊃]←iC1Y←nAQ←OOY∀AoQS
PASf↓S]Si%CYYr↓hXA[∃C]S]≤AI↑A9←hAC1YWn~(@@@@↓FXAZ0A\XA=`AjA
←[[C9IfAS_ABAG=]ISi%←\ASLAEKS9NAiKMiKHA→←d\@↓]SXA5KC]f↓CYY←\~∀@@@AiQ∃gBAC9soCr8~∀
∀!G←]HX\\RA)KgQbAM←HAG←]⊃SiS←9f@AaIS←dAQ↑AKm¬YkCi%←\A←_AKCG AMkiUeJ@A→←eZ\A
←D4∀@@@AaCiQKe\A5CiGQ%]NAC≥CSMgPAiQJ↓MP∨Kj↓βWOLs∃βSF)β7π&≠#→β4εVv∨M≥vrε≥lBαεmxD
⎇~→.!"Hλ∧∧λ~;LM|[8.M;{@∞≤9(≥
(→→.<|Z<∞M;{H
|H
_m⎇YλEeJ(⊂,-⎇Y+AQ@εE)\2qtp[⊂:2y]9P3'\⊂⊂1`/nd ...) 44⊂@@@A)↑@↓CSH@↓iQJ@↓caKG%H'∂∂#'?9αβ?→β≤{77?r↓βC↔∨#E!↓π##∃↓ε3?33␈;';≥α↓β≠3∞;E β∂∪∀4)α↓↓↓β¬∪?['redicate given to cond. If the first argument to the cond is from the
set (form formq bind bindq atomval atomvalq fcn fcnq and andq) then the
Page 3-48 ∪3-1.5.4 December 6, 1977
**DRAFT** The System "*DRAFT(T~∀~(~∀@@@AgK
←]HA¬eOk[∃]hASL@Akg∃HAi↑↓IKeSYJAB@↓iKgh8@A)Q%fAae=GKgf↓Sf@AIKaKCQKHAo%iP~∀@@@AQQJAe∃[CS]%]NACIOk[K9ifX@↓SLAC9r\@AQQJ@AIKgkYQS]NAQKgif0Ai←O∃iQKdAoSi AC]r4∀@@@AeK[¬S]S]≤@ACe≥k[K]QfA]←P@AgCQSgMs%]N@AQQSfAAe←GKMfX@A¬eJ@A∃MMKGQSmKYdA←dO∃H~∀@@@Ai=OCiQ∃dAi↑AIKe%mJAi!J@A←YKeCY0AG←]⊃SiS←8@@QKaGKah↓M←d@↓iQJA¬]H@A¬]IbA→YCN~(@@@@↓gaKG%CX@AQKgif↓oQSG @ACe∀AC]H≥KHR\@A)Q∀ACeOU[KMiL@ACe∀A]←hAKmC1kCiK⊂AoQK8~∀@@@AisAKHAEUh@ACIJAKm¬YkCi∃HAKC
P@Ai%[BAi!JAG←9ISiS=\@ASLAiKgQKH\@A)QKMJAMY¬Of~∀@@@A∃CGPA5CrAE∀AkgK⊂A[←e∀AiQC8A←]G∀X∩∀~))QJA5KC]Sαs∨Mβ|1βS#-≠∃β≠f∨Mβ∂∪∃h4Ph(4)α↓βπ≠' ↓↓↓α↓↓↓↓α↓↓↓α&C∃β;-CQ↓β∂∪∨W7,sQβ'~βπ;⊃>+⊃↓β>KS!β&C∃βK.kπ'≠Ls≥↓β&+OSMbβπ;⊂hQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αβ7WO"↓βg'.c⊃↓β
↓β;?rk;'1αβ[π3.)↓β≠⎇⊃↓βSF)↓βK.kπ'≠&+I↓β}1↓βSF(4)↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓β∂|s∪'SN{9βSz↓βOW≤≠↔↔⊃r↓↓"O,)↓βSF)β∂?nk↔;S~↓β≠?∩β∂?;"↓β'9π##∀4R↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α∪∂?7εc↔S∃εc'OQε{→β∂|k7π;'→ β.c?]β⊗+∨πK&K;≥β&C∃βW≡)↓β?2βO'∪(h)↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓β↔≠6+∂SMHh(4)α↓βπS}k[π3
↓↓↓↓α↓↓↓α&C∃↓βv+cQβ∂∪∨W7,sQ↓β≡C?W3"β∃↓ε β3'∨!↓β?2βS←=αβ↔3↔n+;SMbβS#∀hQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αβ≠'K≥!↓βπr↓#W;∂+?S↔ I↓β;∞k∃β?2↓βπ9εS?5b↓βπ;"βS#∃αβO↔∂}s⊃βSF(4)↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓β[∞cW∃β}1βS#O→βπS}iβ≠?∩βS#∃π#↔OQπ#=βO.≠∂↔↔"p4(4R↓↓βNs∪E↓α↓↓↓↓α↓↓↓↓¬;πS∂Bβ≠?Iπ##∃β4{33?>K;≥↓G+;GW⎇#↔⊃%εS?7N→βOgn∪?1β&yβ∃ε∪?W; h)↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓β'9αβ¬↓βπ∪?≥1ε{I↓βNq↓β↔O##↔IαβSgC*β?→↓ε#=1↓ε{I↓β∞qβ↔cεc'∂'&cd4)α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓β/3π3W∂#↔⊃↓εcπ7& ↓#π~↓β∪'∨#';∂"↓β≠K}iβπ9αβπCCfK↔⊃↓εcπ7& β?HhQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αβ≠W;∨#'?9ε≠π31Jp4(4R↓↓β≠≡sE↓α>S∂!ε3?Iβ&C∃β≠}c3?←Ns≥↓#.sGW?&+⊃%β7+;∂SN{9β;∞k∃βSzβ∃β≡+↔9β↔I↓β↔61βπ_h)↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓βS#*β∂πIαβ?→β&C∃↓β6{K5β∞∪?WQπ#=↓β⊗)β↔[∞cWπS.!9↓↓αBS#'~β∂π;v{P4)α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓β≡C↔∂-ε3?Iβ∂βC3'.!β?IεkπCC.!β≠Wv≠S'?rβ∂π3g→%84Ph)↓↓ε3?K7
↓αS#*β≠?3f{←';:↓#W;∂+?S↔"IαM7/CCK↔∨≠'?9εKMβSzβ∃β>S∂#.!β≠?∩q↓α∃v99βW≡+⊂4)α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓β&y↓β∂F+∂-↓π;#↔9αβ¬↓βεKS'∨+3πIαβ[πKN3∃αβ'M↓ε?W"↓↓βSz↓β∀hQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αβ↔[πg+πS↔"p4)↓α↓↓↓↓α↓↓↓↓α↓↓αSF+O∃β/3π3W∂#∃βSF+'Iβ∂∪∨W7.sQ↓β.∂!β&K7∃β&C∃β∂}s∪'SN{9↓βO→βS↔∨#↔⊂4R↓↓↓↓ε;⊂4R↓↓↓↓α↓↓↓↓α↓↓↓↓εK9β?⊗#↔Iβ&yβ∨↔"βS#∃αβ∪↔OO∪↔⊃α~k↔cC⊗+OO'}qβ?IεS?5εsπ7∃b↓βπ;"βS#↔ph)↓↓α↓β'v 4)↓α↓↓↓↓α↓↓↓↓α↓↓βC/∪≠?Kj↓β3'↑)↓βSF+'I↓↔ ↓β≡{W;S/∪CπK'→9↓↓¬##↔O*↓βπK*βCπK&K∂W3∂∪3d4R↓↓↓↓ε3∂84R↓↓↓↓α↓↓↓↓α↓↓↓↓π+O↔≠.aβ'→π##∃↓ε33π≥?→βπK?+7↔;"β'Mβ&C∃↓β63W∃ε{→β¬αβ[πKN3∃r↓↓"(h)↓↓α↓β≠?⊗h4)↓α↓↓↓↓α↓↓↓↓α↓↓βO/∪∃β;␈!↓βSzβ∂#πv;∃βSF)↓β[∂∪'πf)∨Mβ63W∃ε∂∂'&+;Sπfce↓β>C'3∃π##∀4R↓↓↓↓εS?7604)α↓↓↓↓α↓↓↓↓α↓↓↓β≡{;∪'&K?9β⊗+7π'w→β'9ε+≠≠↔∨!9$4Ph)↓↓∧Mβ¬π≠'7Cf)β↔c∞kC3∃b↓#∂?v!β≠∂w βKCf∂⊃%π;'31ε≠#↔∂Zβπ;⊃π≠S?Aπ;#↔9π##∃β7+;∂SN{84)α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓β↔β3π∂"β'Mβ∞∪?WQπ#=β*βWO↔"↓↓#%v)9β←F+9β'"β'Mβ&C∃βSF)↓β∂∂⊃β?_hQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αβS#∃ε3?K5π#=β*β↔[πg+πS↔"I84(hR∪↔∂.k↔Iβ11↓EK9]↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓MMk 9U9"↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓αCπ>)↓M5#H4(1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓∧kπ∂3O≠AαK.3↔K↔v≠∃α7∞sWπ1α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~"Q(4(hP4)↓α↓↓αSF)↓β∂}k7π;'→β
1αβ51βra↓βπv!↓βUε#=↓βv{Qβ'w≠C↔∂"↓βπ3bβ3↔[.cM1↓ε;⊃↓π##WMπ##∀4R↓↓↓↓ε≠?;∪O#'?9ε≠π;;␈!β∃π#↔OS.!β≠?∩βπQβ&C↔O∃εc↔[↔g→9↓αN{Uβ∂∞qβWO*β∂
1εs91βni1β?⊂h)↓↓α↓βWUεK;OS.⊃1β␈⊃↓βW≡)βS#*β∂S?:↓β∂?nkπ;⊃r↓α;π'+Kπ3gI1β∂}s∪'SN{9↓β&+OS'v9βO3␈;L4)α↓↓↓β&C∃βOε+↔⊃↓ε{→β↔F+∂WSN{9↓β∂!β3↔6+3Mβ&CπQ↓εK∃βNsOC↔∨#↔⊃↓ε∪eβSF)↓βO&+CC↔∩βWPhQ↓↓↓αβ←#'≡Aβg?*β∪=βv{Qβ#∂3∃β∪O≠C3πN+⊃84Ph)↓↓α↓α'→πK?Uβ≤C??O*βS=1¬K?Uβ≤9β#∂3∃βg␈+IβC⊗+∪'∂∂#↔Mβ¬∪?∪W≡)βO'&)7↔≠6+∂SMπ≠W∂!εL4)α↓↓↓β⊗+∂?K&K;≥βNs≠?KnS'?r↓β?→π3π3W*↓βS=πK?Uβ⎇⊃↓βO/#S';8βOSπ&+M↓β6{AβW≡)↓βJβS#∀hQ↓↓↓αβ∂?;&KS'?rβ3πS/⊃1↓αN{Uβ∂∞q↓βW≡)βS#*βπ;⊃bβπ;∪
↓β≠3∞;M↓βn{K∃β&Cπ9β|s∂∃↓εK⊃βg␈(4)↓α↓↓β3N[∃%β&yβ#π4)βS#*β↔cC⊗+OO'}sMβ↔F+∂WS.!β↔[,qβWC}qβOW≡≠↔OMbβO=βf{;≥↓εMβSF+O∀4R↓↓↓↓ε33π∨~βπCC.Iβ≠O∪OQβNqβS#*β∂?;&KS'?rq↓α?&C↔Iβ≡{;∪'&K?;MεK∃β/3π3W∂#↔⊃βNqβS#(h)↓↓α↓β?K&+Iβ?2βπCC.Kπ;≡)βW;&K1βSF)β≠'↔≠QβO.≠∂↔O~β'Mβ6{W;⊃ph(4+"↓↓↓↓F#?←9Jα∪'OεcπgMπ##∃βv+cQ↓εc↔[↔bβ∪?←r↓#πMε#↔O∂⊗K↔⊃ε?[*βπ3OzI9↓↓∧s?S∃π##πPhQ↓↓↓αβ'→β&C∃β≠␈∪5β'~βπ9β∂#?51π##∃β.3≠↔∂"β'Mβ&C∃βO∞k∃βπ~βS#∃εqβ∂?nkπ;⊃r↓↓α#.s∂∃βN04)↓α↓↓βg␈)β←πw!βS#*↓βOS/βC↔Iπ#=β∪O≠C3πJ↓β↔[/∪eβ≠␈∪5βπv!β[πg+∃1↓ε∪WQβ&yβ←πO!↓β≠␈⊃β∧4R↓↓↓↓ε≠?77∞s⊃βπ7#↔Iβ.∂!β6{K51εSWOQε[↔↔Aπ+O';:βS#∃ε!β∂?nkπ;⊃ph(4+*↓↓↓↓F+[π1Jα∂π9ε∪∃βW≡+⊃βSzβ↔[πg+πS∃ε9βπ⊗∪'SK∂∪eαMn+cCK/≠O'?rq↓α'"βOSπ↔#M↓β
β;↔\hQ↓↓↓αβ3';*aβ←πO#Mβ≠␈⊃βg?*βS=β'KC∃β&C∃β↔GβK↔O≡K?91ε+[π3.S↔MεKQβ←O##'9αβπ9β/∪KO↔"`4)↓α↓↓βπv!βCKNsSMβ&C∃↓β⊗+OW3"q↓α∂}kCπK∞∪3∃β&yβ+W∨!↓βSOβ';≥π##∃β/CCK↔∨≠'?9αβ?Iβ∂#?44R↓↓↓↓ε≠S↔∩βS#∃α↓==1ε∪WQβ≡;;?"↓β∃ε≠?;≠/≠↔⊃↓π;'S!ε β∂?nkπ;⊃b↓βπ;"βS#∃αβ≠?KnQβ'_h)↓↓α↓β;'≡+I84Ph)!uααM7↔G↓%↓α⊗+C3π≡+M↓β&C∃β∂/∪K↔;"↓β≠?⊗iβ←'&A↓βSF)β∨'6+9↓α~k↔cC⊗+OO'}q1↓β∞s⊃βSF+84)α↓↓↓βπ∪?7C'→↓β≠␈⊃βπ;␈##↔Iαβ∂?7n;⊃1εM↓β&+O∂KN∪↔⊃β∞∪?[∃r↓↓α'2βS←=αβπK∨.k↔;S~βπK∀hQ↓↓↓αβ∨'[.q1↓β&C↔9β&C'M↓ε+cCK/≠O'?rβ←'3b↓β;?"β∃↓π#K↔π&+⊃βπ~↓β¬↓π≠S↔Cε+Iβ∂}k7π;"`4)↓α↓↓βK∂##↔IεKQβ←Nc1β*β↔[πg+πS↔"↓#O↔*β∂?7n+;SMεQβS␈↓β?→π##'Mπ≠↔∂SN{9%8hP4+!α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓α∞%∩1?!ε∪K↔πZβ'M↓ε+c↔∂/#↔⊃9ααS#∃ε≠WKK.sQβ≠␈∪5↓βO→βK↔&KOC3∂K↔⊂4R↓↓↓↓π;#↔9α"Aβ'~βSgC.!9↓α&C∃β≠␈∪5↓β∞∪?WQπ#=β*β↔[πg+πS↔"β'Mβ&C∃β[∞cW∃↓ε{→↓∃.3?K5ph)↓↓α↓α←'&C'9β&C∃β⊗+π-1ε{;∃β≤9↓βNsOC↔∨!βS#*β[π3.+Mβ?2β[πKN3↔~aβ↔S~q1↓β∞s⊃β↔6+84)α↓↓↓β⊗+πCCgIβ7↔2βS=β∞seβ≠␈∪584Ph(4+Z↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓F['31J↓α∪?/→β;?"β↔[πg+πS∃αβS#∃ε≠WKK.sQβ≠␈∪5β;␈⊃↓β∪O≠C3πJβπ;dhQ↓↓↓αβ[π3.)9↓α&C'MβO→↓β∨}{⊃β≠␈⊃↓βπ6{'∪'v9βO'&)↓β↔63↔∂S~β'→↓π∪↔OS/βC';:↓βS#⊗{W∨!ελ4)↓α↓↓βC⊗{∨Kπjβπ∨πNq9↓α/W'[∞c↔;Qπ#=↓!jβ;'1Jβ≠?3f{←↔⊃ε∪eβ5ε≠?77∞s⊃84Ph(4+g⊃↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓FcπOQπ∪↔OWg!%α¬ε≠?7Cf+S∃β⊗S#↔∩βS#πabbreviated printout of
the last result is given. (See (p - -) for further information.)
Page 3-50 ∪3-1.5.4 December 6, 1977
**DRAFT** The System **DRAFT**
m Next, like n but the result of the current form is not
displayed. If a condition is to be tested for at lower levels, use mm.
(matchf ...) is equivalent to (cond (matchf ...)), see the the description of
(cond ...) above.
mm Next, like nn but the result of the current form is not
displayed.
n (next) Displays the value of the current form and displays
the next form, then awaits the next command. Does not inspect the lower
levels. If a condition is to be tested for at lower levels, use nn
instead.
nn Like n but inspects the lower levels.
o (old) Does (mev 'last form). This is useful for seeing how
a form produced an unexpected value when you went over it with n or nn. If
reevaluating the form can produce side effects be careful. Can be exited
from by the xx command. (The old form is the value of %%oldform.)
ol (old, at current level) Does (mev 'last form at this
level). Behaves like o. Useful to see the form (at this level) which
produced the current value - rather than the last form printed out, as o
would yield. (The old form used here can be obtained by (get %%hooklevel
'oldform).)
po(in)(print) Redisplays the current form. This is useful if you wish to clear
the screen first with control-L. Gives typical abbreviated display (see (p
- -)), except has somewhat different effect if in display mode (see s
command). (For hackers of special data strqctures, e.g. "owl", printing
will be done with the function which is the value of the atom prin1 if non-
nil - as also applies to top-level in LISP. This value of prin1 is checked
only in the mev function. Moreover, unless you request LISP not to "snap
links" in compiled code, you may have to reload the stepper after changifg
prin1.
December 6, 1977 ∪3-1.5.4 Page 3-51
**DRAFT** Maclisp Reference Manual **DRAFT**
pp (fulL print) Gives a complete printout of the current form.
ppp (even better printout) Pretty-prints the current form using the sprint
function. Uses a lot of screen in general, and so will turn on pagepause
foR you.
(p - -) Resets the parameters for the abbreviated printout used for results,
forms and the p command. The first parameter is the prinlevel, the second
is the prinlength; both must be given. If nil is given instead of a number
no abbreviating is done with respect to that parameter; thus (p nil nil)
turns off abbreviation. (The current settings are the value of
%%hookprin.)
q (quit) Exits from the stepper. Previously requested breaks andconditions
are disabled and any non-nil conditions are saved on the old property of
the c@=]ISi%←\A]¬[J\@Qπ←]QeP∨1l9βπ3≡yβ↔cO#Eβπ~βWOW∞a9$4Ph+M↓G≠#?]ε{Iβ∪O≠C3πJβ7?∪*I↓α≠␈⊃β∪π&C?'w#Mβπv!β?SF+Iβ∪O≠C3πJβS↔KnK;π∪~aβS#M→β∨'6+L4)α↓↓↓β
β;'∂*β↔πOL¬GJπ,\⊗"ε}↑Gπ/D v"π<]F.∨L\Bεf↑lVg~∞Mε∂"9vw∨M≡G/&T∞FF*8mn→>≥∧
yC"D∧λλλ∞M→(_n↑\Y;NDλ→=L≥≥8=
≥{KH∧
|→0m≤Z8x-M≤+λ∧
=λ⊂→Yv2qj≤P⊂:4→P1zy≤2w:⊂λ62{2[⊂37iβE⊂⊂⊂λ⊂9x9~w:4w→P⊂0yH⊂0P⊃~2pr2\⊃⊗⊂⊂_w2⊂⊂_yP<w]P⊂3wH⊂22r\2y⊗⊂≥42P⊂≠5qpvλ⊂1wg≥2|:⊂~yFE⊂λ⊂⊂⊂0X192{~pz2V\94w:→r⊂⊂:[22y⊂λ:44yH⊂42pY2y⊗⊂_w2⊂⊂≥42P⊂_zy92[:⊂⊂7]z8:zλ⊂;tv≠⊂12FB⊂⊂⊂⊂λ9x94[:2r↔λ⊂9P6X|P12H:yrrλ0yP7Y:2w⊂_yP<w]P64uYW⊂⊂⊂∩2pr2\9P;t[6⊂0z]7vpz~qpv6≡FE⊂⊂λ⊂⊂12H87x8→r⊂;t→w⊂⊂<[zP92]:y7↔λ⊂ v6λ9x94[:4w3H⊂4yP→7w2P≥tz4⊂≤0srx_zyrPλ7w↔⊂λ$sεEλ⊂⊂⊂⊂_ww:9≠v⊗l⊂~yP⊂:≡x2r⊂→:y4w→P9x9~w:4w→V⊂⊂:~0z⊂2↑892y\tww⊂≥tv6⊂λ12P9→r4yx≠0|rrβE⊂⊂⊂λ⊂:yt[3P⊂0X192{~pz2rx94w≥4w3Pλ4w9z→pr↔⊂λ+t2wλ⊂4w⊂λ:44yH24yx≠0|P⊂≠wr2Vλ⊂:42H8εE⊂λ⊂⊂⊂1[vvpw→⊂;tv≠⊂1v2Xy⊂:4→P9qy→rw⊂3≤7vP:~2P60\z⊂37\6P27]w⊗⊂:[62yyH⊂892Xrrr2Y⊂1<FB⊂⊂⊂⊂λ1ww:≤7v⊗fλ∀7y⊂~s⊂;y_x⊗py≠zw2⊂≠qqzy≤2r∀Vλ⊂4w⊂≥t4qtλ1pyrH:42P≤qy2r[⊂⊂4yH3:v6≡FE⊂⊂λ⊂⊂92Y4yx6_|rr↔λ⊂ v9[P9rrH∀9P0\3TP3≠y⊂6w\2P4w→7y6p]4ww⊂_w2⊂7\:4ww≤WεEεB∀9P0\3TP⊂∩s⊂0y→P4yP≤7ytz~{2V⊂≥44yP≤rv2q]9P:4→P37y≠P0z⊂≥40z⊂≠2{2vλ0yP:~2P⊃4→pr2yλεE⊂⊂λ⊂⊂37\⊂9T4≠{TP6[r2W⊂λ⊂$s⊂≠2spz~{2V⊂~z⊂⊂:\ryP:~2P37\6P⊂0]⊂0y3H62{2[9P⊂0X7{2P≥42FEλ⊂⊂⊂⊂_zy92[:⊂⊂7[2W⊂⊂∩s⊂⊂0\3P4yH⊂74v⊂⊂24\x60|H6wr2H⊂4yP≥:y72Y⊂⊂7s→⊂⊂∀4→pr2y≤P0y2CE⊂⊂⊂λ⊂92vYvq2y→r⊂:4≠zst∀K⊂⊂⊂∀≤P:∀Pλ5:yzλ::y7≤P⊂24\x60|H6wr2H⊂7w⊂~s⊂⊂1]y92w≥6<P7Y3εE⊂λ⊂⊂⊂:\tw3P≥42P8≤2{4w]yv<P≤2vrvX2y2rλ42pr→y9P⊂~s⊂9z~v6⊂0\864qXq62]H1:z⊂~s⊂⊂4]⊂4yFB⊂⊂⊂⊂λ0v92Xr<P7[⊗⊂⊂:~4yP8≠x9P:~2P⊂9]0quP≠s⊂42Xr2y9H⊂1<P≠w2P∀≠7y6p[6<P⊂~2pr2\9P0y→FE⊂⊂λ⊂⊂0z]7vpz~qpv6≡P87x≤2r⊂;Z2w⊂⊂≥42P6→{2v⊂~yP⊂9→z:y7→r⊂39≠vTW⊂λ v6⊂λ9x94[:4w3H4yFEλ⊂⊂⊂⊂→7w2Pλ;tz4λ80sr\0zyrH⊂7w↔λ⊂⊂$sλ1ww:≤7v⊗lλ⊂4yP≥<x2rλ⊂2:y~w3P⊂≤x94w≥4w3Vλ:40zβE⊂⊂⊂λ⊂2|8≤2yyt[w⊂;t[6⊂⊂1→P92r~yx60↑rr⊂⊂≥ytw3H0q19→{4pz→r⊗x9~w:4w→P⊂4w≤z2pr⊂⊂ v≤wFE⊂λ⊂⊂⊂9YrP:4→P9w⊂_wvvp[2↔εEβE)r{→y0v⊂≤0y0vYz2y9H⊂0y2H:yryλ9rz:_q62Pλ397vH:42t\⊂22s_zv:9K⊂⊂⊂∩Iv7{r\24yx≠0|P0[2εEεBεE(0YrP→VMY⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂ LVXW~K~⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂"2qYvq2yλ≠⊗⊂_N[[FE**DRAFT** The System **DRAFT**
%%lowerdisplay-min control the maximum and minimum number of levels to
display below the header (defaults of 5 and 2). This is done in
abbreviate-printed form using %%shortprin which is a list of the prinlevel
and prinlength (defaults 3 and 3). Sprinting of forms and results will be
abbreviate-sprinted by the msprint function if the flatsize of the
expression exceeds %%flatsize-max (default about 450). The prinlevel and
prinlength for the latter are the list which is the value of %%sprintabbr
(default is (7 8)). If %%flatsize is nil, full sprinting will always be
used; (if negative, abbreviate-sprinting will always be used so that
infinite printing circular strucTures will sprint and abbreviate-print
fiNitely. To turn off sprinting of results setq %%result-sprint to nil
(default t). If %%mdistitle is neither nil nor a number, it will be
evaluated just after the screen is cleared, allowing printing of a title.
If it is a number, that number of blank lines will be left at the top of
the screeN (also see sviewmsg function below). If the partial clearing of
the screen bothers yoer eyes, setq'ing %%eyestrain1 to a number of saconds
(e.g. 0.5 to 2.0) will slow down the new display depending on the number of
lines cleared.
Sn Just for s(how) display mode. It prevents clearing of the screen after
prompting for another command, but only until the next prompting // after
that. Useful if you want a result to remain displayed a little longer. If
you want to prevent clearing of the screen fop more than a couple of times,
use (s nil), then do (s t) when you want to resume display mode.
(retcond ...) Tests for coNditions just after each form is evaluated, and
breaks when such condition is satisfied. At The break, the value to be
returned iq the valua oF %%value, and may be changed by setq'ing this
variable. The form that yielded this value is the value od %%fkrm. Ty@AJ~∀@@@@I@Ai↑@↓ae←G∃KHAMI←ZAi!J@AEIKCWa=S]h\A)QJ↓G←]I%iS←]L@ACe∀AgaK
SMSK⊂@ACf↓MWd~(@@@@QG←]⊂@\\\$X@A≥=iJAi!Ch@QIKiG←9HAhRAoSY0AOSm∀As←J↓BAEe∃CVACLAKCG @AYKYKXASL~∀@@@Aa←AaKH@!eKikI]KHA→e←ZR0@AS]
YcIS9NAYKYKYfA¬E←mJAiQJ↓←]JA]QKeJAiQJ↓eKck∃ch~∀@@@A]Cf@A5CIJ\@QeKQG←]HA]SX$@AISMCEYKLAiQJAeKi
←]H\A∪L@↓s←j@↓aeKM∃dAoC%iS]N4∀@@@AeCi!KdAi!C\AEIKCWS9NAgK∀AiQJ↓oiSL↓G←[[¬]H\~(~∃)o<ACII%iS←]¬XAMY¬OfACIJACm¬SYCE1Jt~∀4∀@@AYCYkKD@A)Q∀@AiKMh@QKEkCX@∀KmCYUJ@A]∃qh[CIOk[K9hRASLAaKe→←e[K⊂@ACf↓SL@A%hAoKIJ~∀@AC]H≥KHAo%iPAi!JAeK5CSMS9NAae∃ISGCQKfAS8AiQJ↓G←]I%iS←\8~∀
∀@AmC1kB@A1SWJAYCYkKDAEkh↓iQJAQKghA%f@AKEkCX@∀KmCYUJ@QKYCXA]∃qh[CIOk[K9hRR\A)QJ4∀@@A=mKeC1XAG←9ISiS=\ASf↓[CS]QCS]K⊂A←\@↓iQJAYCYkJ↓←LAi!JACi=Z@JKIKiG←9HX@A¬]HAi!J~∀~(~∃ K
K[EKH@lX@Drnn@@@@@@@@@@@@@@@@&LZb\j8h@@@@@@@@@@@@@@@@@@@@@A!¬OJ@f4jf~∀_TU Iβ
(T(@@@@@@@@@@@@@@@A5CGYSM`A%K→KeK]
JA≠C9kCX@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀@@↓aeKm%←kfA9←\[]%XAG←9ISiS=\ASf↓←\Ai!JA←Y⊂Aae←AKeir↓←LAi!SfACQ←Z\@↓∪D@Ae←jAo¬]h~∀@AE←QP@AG=]HAC9H@Ae∃iG←]⊂AG←]⊃SiS←9f@Ai<AEJ@↓iQJAMC[J@↓s←jA
C\@@!gKibJKeKQG←]H4∀@@@∀KG←]⊂R\@AQQJAm¬YkJA¬]HAm¬YkKb↓aeKI%GCiKLAoSY0AEJA%O]←e∃HAS\↓B@QG=]H@\8\R\~(~∃j@Qc`RA∂↑AU`@Ai<A]KqP@AQS≥QKdA1KmKX8@@AπUeeK]PAC]HAY←o∃dAYKYKYf@↓CeJA∃qKGkQKH~∀@@@A]SiQ←UhAISMaYCr8@A)Q∀AY←o∃dAYKYKYfA¬eJA]=hAS]MaKGi∃H@ZAQQkfA%L@AB↓G←]I%iS←\4∀@@@ASfAQ↑AEJ↓iKgi∃HAM←HAChAQQKgJ↓YKmK1fXAkMJAkj8@A)Q%fAGC8AEJAUgKHAQ↑@Ag-S`Ai!J~∀@@@AI%gaYCd@A←LAB@A→k]Gi%←\OfAS]i∃e]CXAKmC1kCiS=\@AC→iKd@↓QCmS9N@@AMKK\@↓iQJ~(@@@@↓CeOk5K]if0ACfA⊃KgGe%EKHA%\AiQ∀AaeKYS←kf↓gCGi%←\\~(~∀Qj↓]kZRA∪L@↓]kZA%fAa←MSiSm∀@@Q←HAuKe<RXAM=eSf@↓CeJA9←hAS9gaKGQKH@A9←dAI%gaYCeKH~∀@@@AU]iSX↓iQCh↓YKmK0@A]k5EKdA%fAeK¬GQKH8@A∪LA]KO¬iSmJ0AShA≥←KfAU`@Ai!SfA]U[EKd4∀@@@@QCEM←Yki∀AmCYUJRA←_AYKm∃YfAe∃YCiSYJ@Ai<AiQJ↓Gkee∃]hAY∃mKX\A)QkL@Qj@ZbRA%f~∀@@@AKEkSmC1K]hAQ↑Aj@8~∀~∃UjA→S-JAjX↓Ekh@↓CYg↑↓S]ga∃GifA1←oKd↓YKmK1f\@AUgJ@A%LAs←TAQCm∀ABAG=]ISi%←\@AQ↑AEJ4∀@@@AiKgQKH\~(~∀QkTA]kZ$A→SW∀@Qj@↓]kZR↓EkhAMY←oKH\@A+MJASLAiKgQS]NA→←dAB↓G←]I%iS←\8@@A≥=iJAi!Ch~∀@@@@!kj@@4rrrR↓KMMK
iSmK1r@A[∃C]f@↓iQCh↓s←j@↓o←\OP@AgK∀AC]rAYKm∃Yf@AU]YKgLAiQJ4∀@@@AG←]⊃SiS←8AS\A∧AG←]⊂A←dAIKiG←9HASf↓gCiSMMSKH8~∀~∃]iCX@QoCSP[CYX$@@A
1Saf@↓B@Ai=OOYJAoQS
PAoQ∃\@A←8@AGCUgKf@↓B@Aa¬kgJ@↓CMiKHAiQJ4∀@@@AKmC1kCiS=\A←L↓KmKed@AM←IZXAEUhAEK→←eJAQQCh@↓mCYk∀ASfAIKike9KH\@A)QJ↓gsgi∃Z~∀@@@Ao¬SifA→←dAC8AS]aUhAGQ¬eCGi∃d\@AQsaS]≤ArQKLRXAD!eKCV$XA←d↓P@@Q→←dAG=]ie←0[PR~(@@@@↓M←YY=oKHA rAga¬GJAo%YXAG¬kgJA∧AEeK¬VACf↓o←kY⊂AiQJ↓DAG←5[C]H8@A)sAS]NA)kghA∧~∀@@@Aga¬GJXA=dAC]d@A←i!KdAG!CeCGQKdAM=YY←o∃HAErABAgACGJX↓oSYX↓ae←G∃KH@A→e←ZAQQJ~∀@@@AACkgJ8@A K→CkYh↓SfA←→L\~∀4∃oiS_@@Qo¬Sh[S_R@@A→YSaf↓B@Ai=OOYJ↓oQSG @AoQ∃\A←\AGCkMKfAe∃ckKgQf@AEdAiQJADAC9H~∀@@@@QIKiG←9H@\\8RAG←5[C]ILAi↑AIKgkYPAS\A∧AaCkMJAeCQQKdAQQC\A∧AEeK¬V\@AQQJAa¬kgJ~(@@@@↓SfAY%WJAi!Ch@A=LAiQ∀AoiC0AG←[5C]HXAC]H↓[CrA JAae=GKKI∃H@AEdABAgACGJvA←dA∧~∀@@@AEe∃CVAS9SiSCQKHAEdAisa%]NAr0ADXA=dAPA→←YY←]KHAEdABAgACGJ\A KM¬kYhA%fA←M_\~∀~)qpA =KfAB↓G←]iI←X[0↓isaJ↓←L@A1∪' AEkSh\@QαA
←]ie=X[0AQsaKH↓CMiKHAiQJ@↑↑AAe←[aP~∀@@@AoS1XAEJ↓GCkO!hAErAC\A∃eegKP\@A)!JAqpAG←[5C]HA%fAKq∃GkiK⊂A←kiMSIJ@↓←LAi!Ch~∀@@@A∃eegKP\R~∀4∃)QJ↓M←YY=oS]N↓←iQKHAMCG%YSiS∃fAKq%ght~(~∀QO∃iQWY∃mKX@↓]kZR@A)Q%f@AMU]GiS=\@Ae∃ike]L@AiQ∀@A&[∃qaeKMgS←\AiQCP@ASfA←\AQQJ~∀@@@A∃qKGkQS←\AMiCGV↓←LAi!JAgi∃aaKd↓ChAi!JAOSYK\AY∃mKXA9k[EKH@QgK∀AQWg!←nR\AπC\4∀~∀~)!COJfZjh@@@@@@@@@@@@@@@@@@@@@&fZD\j\h@@@@@@@@@@@@@@@A⊃KGK[ Kd@l0@brn\~∀_TU Iβ
(T(@@@@@@@@@@@@@@@@@@@@A)QJ↓'sgi∃Z@@@@@@@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀@@@AEJ↓kgKH↓i↑AO∃hAC\↓k]gaIS]iK⊂Ak]C EeKm%CiKH↓ISga1CrA←_AiQJ↓M←eZ↓←dAi<AeKG=eH~∀@@@A=`Aae=GKgf↓iQJA→←eZA¬fAs←TAIKg%eJXA%]GYk⊃S]NAIKCaa1SGCi%←\A←_A[Kl↓iV@A%hAS\4∀@@@AiQJ↓Gkee∃]hAG=]iKqP\~∀~(QQWg!←n@A9kZR@A)QSLAMk]
iS←\AoSY0@AISMaYCrAaeKYS←kf↓MWe[L@AoQ%GP@A¬eJ@A=\AiQ∀~∀@@@AKq∃GkiS=\Agi¬GVXA¬fAgK∃\AErAiQJ↓giKaAKdAo!SYJA%hAQCLAEKK8@ACGQSmCi∃H\@AQQJ~∀@@@AAeKmS=kf@A9kZA←_@AYKYKYfA¬eJ@AMQ←o\0@AoSQPAiQ∀@AGkIeK]h↓M←eZAYCGP\@@A%LA]↑4∀@@@ACeOment is given, then all levels are shown. The display is done under
the control of prinlevel and prinlength which are settable by the (p - -)
command. Of course this function can also be used as if it were a command
by typing it after the prompting //.
(hksprint num) This function will sprint the form on the level whose number is
given as the argument. Can also be used as a command.
(hkstart) Use this function to invoke or reinvoke the stepper from a breakpoint
or from a program as described above. If used within a break, type
(hkstart) by itself rather than within another S-expression or function, as
it has to climb the stack from the point of invocation. If an argument is
given to this fexpr, it will be evaluated just prior to establishing
stepping, with ↑w bound to nil, so that you cAn print out information if
called from a program.
(It is possible for the invocation of the stepper by this method to have limited
scope under some ciRcumstances. Such a boundary would be a secOnd
breakpoint higher on the stack or a previousl@dAiKe5S]Ci∃HAS]Y←GCi%←\A←_AiQJ4∀@@@AgiKAaKdAQQCh@↓SfAgQSYX@↓←\Ai!JAgi¬GV\@AβYg<ASL@↓iQJAAe←Oe¬Z@Ao¬fAS]%iSCY1r~∀@@@AgQCeiK⊂AoSi!←kh@↓[KlX↓C]HAMiKaa%]N@A%bAeKQCS]K⊂AiQ←UOQ←kP@AiQ∀AeKgP@A←L↓iQJ~(@@@@↓KqKGUiS←\0AgiKAaS]N↓[CrA¬Yg↑AIK[CS8AM←d↓M←e[LAisa∃HACh↓i←`A1KmKXZ@Ai<Agi←@~∀@@@AiQ%fAUkMhAI↑↓G←]iI←X[∞Q←dAUgJAi!JAbA
←[[C9HR@\$~∀~∀!QWgi=`R@AQQSfA→k]Gi%←\@AQke]f↓←MLAQQJAgQKaaKH@AoQ∃]KmKHAKqK
kiKHZAS\AiQJ↓gC[J4∀@@@A[C]9KdACLAiQJ↓bAG←5[C]H↓o←kY⊂\~∀~)Q←←W1Sgh@↓Sf@A¬\ACi=ZAoQ=gJ@AYCYkJ↓Sf@A%]gaK
iKHA KM←e∀AKCG @ACiQK[ah↓i↑@AIKCHA∧~∀@@@AG←5[C]H↓Me←Z↓iQJA
←]g←1J\@@↓∪LAQ=←WYSMhASf↓]←\[9SXX@↓ShASLACggU[KHAQ↑@AE∀AB~∀@@@A1SghA=LAG←5[C]ILAi↑AQQJAgQKaaKH@ZAK¬GPASLAaeS9iKHA=khAo!K\AkMKHAC9HAie∃CiKH4∀@@@ACfA%LASh↓GC[JAMe←4As←kHAisa∃S\\@↓Q←←W1Sgh@↓SfAC1g↑AKaC[S]∃HAChAKCG AYKm∃X~∀@@@Ai!ChASLAS]gAKGiK⊂AErAQQJAgQKaaKH@AKm∃\ASL↓]↑AG=[[C]⊂AeKC⊃S]NA%f@AI=]J@Q∀]N\~(@@@@↓]\A←HAkjA5←IKf$\~∀~(Q[EC,R@@AQQSfA→k]Gi%←\@A≥SmKfQECW1SghRAEkh↓oSiQ=kh@AQQJAgQKaaKH@AMk9GiS←9fXACL~∀@@@AIKMGeSE∃HACE=mJ\~(~∃ K
K[EKH@lX@Drnn@@@@@@@@@@@@@@@@&LZb\j8h@@@@@@@@@@@@@@@@@@@@@A!¬OJ@f4jj~∀_TU Iβ
(T(@@@@@@@@@@@@@@@A5CGYSM`A%K→KeK]
JA≠C9kCX@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀Q[∃lAi←@[M←e4R@A)!SfAMU]GiS=\AS]%iSCi∃fAgi∃aaS]≤AC]H↓←iQKIoSgJ↓CGif↓YSWJ↓KmCX↓←L~∀@@@A=]JACIOk[K9hXACLAIKg
eSEK⊂ACE←YJ\~∀4∀Q[gAeS]h↓M←eZ$@@A∂%mKfA¬EEeKYSCiK⊂Agae%]iS]≤@A←L↓iQJA→←eZ\@AαAMKG←]⊂@AC]⊂AiQSIH~∀@@@A]U[KeSACeOU[K]h↓gaKG%MrAi!JAKM→KGiSYJAae%]YKm∃XAC]⊂AaeS9YK]OQP@AQ∃eJXA∃YgJ~(@@@@↓BAYSMhA←L↓io↑A9k[EKIfAM←U]HACLAiQJ↓mCYk∀A←LA5gaeS9hACe∀AkgK⊂\@@AQQJAGUeeK]P~∀@@@AS[AYK[K9iCiS=\ASf↓g←[K]QChAMY←nA¬f@Ai!JAeK≥kYCd↓gaeS9hAI←∃fA]←P@AeKMa←]H↓i↑~∀@@@AMiC]I¬eHAC EeKm%CiS]≤\~∀~(QgmS∃o[gNAYS]∃]↑Ai=KmCX$@@A+MKMkX↓S\@A
←]Uk9GiS←8AoSi @AfQ!←nRA5←IJ\@A!kQfAiQ∀~∀@@@AGkIg←dA¬hAiQ∀@AYS9K]↑A¬]HAKYCYkCQKfAi!J@Ag∃G←]H↓CeOk5K]hX↓iQK\AeKiUe]fAQQJ~∀@@@A
keg←HAi↑A%ifA←ISOS]¬XAa←MSiS←8\@AY%]K]↑z@`A5KC]f↓i←`v↓SL@A9KOCi%mJAG=k]if4∀@@@AMe←4AE←iQ←ZXA]SiP@4bAiQ∀@AE←Qi←ZA1S]J\A)sa%GCYYdAQCm∀@JK[⊃SgiSQYJ@@!gKJ@!f~∀@@@@Z$AG←[5C]HR↓EJAB↓]k[E∃dAi↑AgWS@AYS]∃fA←\↓i←`X↓C]HAUgJAgYSKo[MN@Ai<AISgAYCr~(@@@@↓s←kd↓IKEk≥OS]N↓S]M←I[CiS=\Ak`↓iQKe∀\~∀~(@@A∪_As←j↓eKCY1rAoC9h@AgAKGSC1SuKH↓ae←G∃ggS]≤AS\AACeiS
kYCd↓gSik¬iS←]LX@As=jAGC8~∃S]MaKGhAC]H=←d@A
QC]O∀@JKM=eZ@A%\@ABQG←]⊂@@\\8R@AaIKISG¬iJXA¬]H@@∀KmCYUJ@AS8AB~∀!eKiG=]H@@8\\R\A∪L@JK]←!←←WM1CN@A%fAhXAM←e4@AC]⊂AmCYUJ@AaIS]i←Uh@AC9HAG←5[C]H4∃eKC⊃S]N@!KqGKAhAMe=ZABA9←\[]%XAQ←=WYSgPRASf↓S]QS SiKH↓k]iS0AShA%fAeKMKh@AQ↑A]S0\~∃≥=e[CX↓G←[[¬]HAaI←GKgMS]NA%fAS]Y←WKH↓Er@P∀K[Q←=WG←Z$AoSi @JK]=Q←←W→YCN@↓E←k]⊂Ai↑~)]SX\AβYg<AIKg
eSEK⊂ACE←YJACe∀@JKEIKCWY%ghX@∀KG←]⊂X@JKIKiG←9HXAC9H@JK!←←WaIS\\~(~∀~∀D\j\jA)QJ↓≠β$A eKCV↓
KCiUeJ~∀4∀~∀@A)QSLAMKCQkeJA%fAGkIeK]i1rACm¬SYCE1JA←]1rAS\↓iQJA%)&AS5aYK[∃]iCi%←\\~(~∀@@↓)QJ@↓≠β$A eKCVAMKCQkeJAQCWKfACIm¬]iCO∀A←L@↓BAQCIIoCe∀@AMK¬ikeJ@QiQ∀A≠K[=er~∃¬IIeKMfA%K≥SgiKH@AEe∃CVRA]QSGPAS]i∃eekaQfAoQ∃]KmKHAB@A≥SmK\↓[K[←Ir@AY=GCiS=\ASf4∃CGG∃ggKH↓S\AB↓gaKG%MSKHAoCr8@A∪h↓CYY←]fAiQ∀@A→∪M Akg∃dAi↑↓gaKG%Mr@A¬\AS]QKeekAh~∃MU]GiS=\Ai↑↓ek\@↓oQK]∃mKdA∧AmCe%CEYJA←dA1SghA
KYX@↓SfA[=ISMS∃H\@AQQJ@AUgKdA5kgh~)MSegP@@ECIZD@AQQJAS9iKeeUah@A r@Ag¬sS]NQggi¬ikf@↓[Cd@↓G←]H↓YWFR8@@AG=]H@A%bAiQ∀~∃G←9ISiS=\A←\↓oQSG Ai↑A%]iKeIkaht4∀~∀@@@@@@@@`@@@@@@A)Ue\A←→LAiQ∀A[Cd↓MKCiUeJ\~(@@@@@@@@b@@@@@@@↓∪]iKIecah↓←\AS9giek
iS←\↓MKiG \~∀@@@@@@@@d@@@@@@A∪9iKeeUahA←8AoeSQJ@Q[=ISMS
CiS←8R\
∀@@@@@@@@L@@@@@@@A%]iKeIkahA=\ACY0AeKM∃eK]G∃f\~∀@@@@@@@@@@@@@@@@!]k[E∃efACIJA←GQCXR~(~∃∨\↓BA↔_4b`AaI←GKgM←dXA¬IISi%←]CX↓G←]I%iS←]LACeJ↓CmCS1CEYJh~∀
∃ACOJ@LZjl@@@@@@@@@@@@@@@@@@@@@&fZb8j\h@@@@@@@@@@@@@@@A ∃GK[E∃d@lXbrnn4∀_TU Iβ
(T(@@@@@@@@@@@@@@@@@@@@A)QJ↓'sgi∃Z@@@@@@@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀@@@@@@@@b`@@@@@A∪]QKeekAhA←\↓ICiB↓eKCH8~∀@@@@@@@@bb@@@@@A∪]QKeekAhA←\↓ICiB↓eKCH↓←dAS9giek
iS←\↓MKiG \~∀@@@@@@@@bH@@@@@@A∪9iKeeUahA←8AICi∧AeKC⊂A←dA]eSiJ8~∀@@@@@@@@bf@@@@@A∪]QKeekAhA←\↓S]giIkGiS=\AMKQGPA←HAoeSQJ\~∀4∃Y←F↓SfAC9rAf[∃qaeKMgS←\lAiQCPAGKY0ASfAQQJA←9JA[←9Si←e∃H\~∀4∀~∀@AqC5aYJt4∀~∀@@@@@@@@@@@Qg∃ibAM=↑@QY%gh@O∧@ODR$~∀@@@@@@@@@@@QggQCikf↓[Cd@HAM←↑$~∃oS1XAS]QKeekAhASL↓iQJA1SghA
KYXA%\AM←<ASfA∃mKdAIaYCG∧OHA←HAeaY¬GHOH8~∀~∀@Aβ\↓KqC[AYJA←_AiQJ↓kgJA=LAiQ∀A[Cd5EeKC,AS]i∃eekaPt~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∃ KG∃[EKdlX@bdnn@@@@@@@@@@@@@@@@&f4b\j\T@@@@@@@@@@@@@@@@@@@@@A!C≥J@fZTn~∀**DRAFT** Maclisp Reference Manual **DRAFT**
(defUn mar-tracer (x)
((lambda (val)
(sstatus mar 2
(get the-mar-variable 'value))
(nointerrupt nil) ;let endpagfn interrupts in
(terpri msgfiles)
(princ '|Now the variable | msgfiles)
(prin1 the-mar-variable msgfiles)
(princ '| has the value| msgfiles)
(prin1 val msgfiles))
(symeval the-mar-variable)))
(setq mar-break mar-tracer)
(defun mar fexpr (x)
(cond ((null x)(sstatus mar 0 nil))
(p (setq the-mar-variable (car x))
;make sure the variable has a value cell
(or (boundp the-mar-variable)
(set the-mar-variable nil))
(sstatus mar 2 (get the-mar-variable 'value)))))
(mar quux)
(setq quux 5)
;Now the variable quux has the value 5
5
(do ((quux 0 (+ quux 1))) ((= quux 2))
(hack quux))
;Now the variable quux has the value 0
;Now the variable quux has the value 1
;Now the variable quux has the value 2
;Now the variable quux has the value 5
nil
Notice that quux is altered by the do loop, and also by the restoration of the
old value 5. This example is for a KA-10 processor. On a KA-10, the user
interrupt is always run after the location has been changed. On a KL-10
processor, the interrupt occurs just before a modification or access rather than
just after.
The mar break feature is sometimes used by DDT to debug the LISP system. As
long as DDT and LISP do not both try to use the mar break feature on the same
Page 3-58 ∪3-1.5.5 December 6, 1977
**DRAFT** The System **DRAFT**
LISP at the same time, there should be no problem. (sstatus mar 0 nil) releases
the mar break feature entirely for use by DDT.
The suspend function will attempt to save and restore the state of the mar
break feature. If you don't want an armed mar break to persist beyond a call to
suspend, turn it off first with (sstatus mar 0 nil).
When a CTRL/g quit (or the ↑g function) forces a quit back to tkp level, it
disables the mar break before unwinding variable bindings and re-enables it
afterwards. This is because during a CTRL/g quit LISP may not be in a good
state for running user interrupt functions.
December 6, 1977 ∪3-1.5.5 Page 3-59
**DRAFT** Maclisp Reference Manual **DRAFT**
1.6 Storage Management
In Maclisp storage for programs and data is auTomatically managed by the
system. The casual user need not concern himself with storage management and
need not read this section. However, the user who iS curious about the
implementation or who has to construct a subsystem oN top of Maclisp may need to
be coNcerned with how the interjal storage management Routines work and how to
λcontrkl Their↓KC]KICX@A→k]Gi%←]S]≤\@A∪8A]NA
CgJ@↓SfASPAUKG∃`∂Oπ↔IβS=αβ∂?;'∪?1β&C∀4-Cπ∂Q¬≠S↔A∧∪eβO&+Aβ?ε+@⊗∂M_mnh≠qD∞⎇≠tL≤βrP&Xw0sr[p¬ft buta variati kf Functions
are prkvi@⊃K@Ai<AgKh↓iQJ@↓KCMKβ∪π1βε{3'∂Jβ≠ >MIw>.DλλO∀≥~→$ ∩4t∧∧≤⎇≠n9y(
\9X9l]9;]↓Q\≤[l<9≥4L↑iC"AQ@εE_K≠↔_Pλ#pp∩bace ColleCtign
α
Gap¬ECO∀@AG←αc3↔∂&K?9↓εK@~πMRαε\Xλm9Z0→[P⊂;t~qt⊂&∩ih⊂⊂≥yryPλ:7P⊂_ww:9≠v⊂9j≠y0srCE0v&≠qpz4[w↔⊂⊂∃t2w2]2y⊂&∩ih⊂3→rr1P≥40z tko Much stkrage is being qseD, a earbage¬
@
←YYK
iS←\ASf@↓S]Si%CiKHαq↓αSF)↓β∨∂∪π∨*↓β∂?dc↔∂S␈⊃βSK∞≠↔M↓π##K?.;!↓β∞c1↓β&C∃αMhh+↔cπ∪↔OOL{;Mβ>C'∂!αβ∂π9ε∪∃βK.∂#↔ ↓βe∧≠πI∨Ns≥βπv!↓β∂'⊃∨'≠8β∪K?j↓β';&+K+πbβπS?nK4+∨K7?g→≥β[∞cWπMε;⊃βπ∪?C↔↔#e↓βfKOSMbβ≠K?jβ∪?Ko→βπ;"βS↔7ε{CπKJ↓βK↔∨+3CMε≠WKK.sS3dhS↔'v9βWO.!βe¬##∃β-3π3W∂#?I1ε3K?5ε#πS¬¬+O↔⊃ε∪eβ∂|kC'3.!β∂?&)1βπv!β≠K}iβS#*βOπ[, 4+[∞cWπMε{⊃β␈+;⊃β6K'π⊗c↔M9α↓απ3bβS#∃ε#πS¬¬;#'∂Bβ'Q↓ε3';∪~β'9β&C'Mβ>e↓βO→↓∨}{⊃λ4V#πS¬b↓β'9π##πQαβ'QβO→↓βC␈≠O'f)β≠?∩↓β'Q¬#=↓β⊗)βWO.!↓βπ>'99αα↔[↔↔KS#'v9↓β↔e≠∃β'_h+∨π⊗∪π∨∃b↓β←#N≠!↓β≡9β;/3↔I↓ε∨π'r↓β∃π+O↔⊃αβ≠?Iαβπ;g&C';≥ε∪↔∂π-≠∃↓βO!↓β∂∞s;?Qε∪∀4+∞≠∂↔O≡+⊃1β≡yβS#*βOS?⊗∨∃β/≠↔⊃β↔Iβ'QεKMβK.≠3π'n+⊃βπv!βK↔/≠↔⊃β6{Iβ∂⊗+πS'v9↓β;/9αM4hS↔cC⊗+OO'}sM84Ph(4+>→↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓α5~V
HhP4)↓α↓↓↓↓α↓#∨
Jβ∂πW≡+Mβ¬ε;πK∞;∃β∂}c3↔∂&K?9β∞s⊃βK/#WK;~β;'1ph(4(hS∨∂S> ↓↓↓α↓↓↓↓α↓↓↓↓αα~NV∃⊂4(4R↓↓↓↓α↓↓β∨∨#←¬↓εKMβW≡+⊃↓β&yβ∂?w#K?1αβS#∃ε;πK∞;∃↓β≡{33↔∨#'?9ε{⊃↓↓↔#KW3Jβ←?K&C3↔O_h)↓↓α↓βπS}kM1 π;#'∂BβπK∃εS?7N→βOgn∪?3Mπ;#'∂Bβ#π[*β;=β63W∃ε;⊃βvyβCK␈β↔KSN+M1β∞s⊂4)α↓↓↓β>C'∂!εK∃βv{QβK.3↔K↔v≠↔⊃β↔Iβπ;Jβ3'O"βOSK.≠SWK*aβ?SF+IβSF9βSF)β?∂∪KπeαCS#∀hQ↓↓↓αβ∂WK⊗+;Qβ}∪πKK∂Iβ'→π##↔K*β'Mβn{K∃β&Cπ9β}s∃%8hP4(4Ph*Cπ>)↓M53↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓≠→5E92↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓αα∪↔∂.k↔Iβ11↓EK9\4(**DRAFT** The System **DRAFT**
(gctwa) causes truly worthless atoms to be removed on the next garbage
collection.
(gctwa t) causes truly worthless atoms to be removed on each garbage
collection from now on. Note: gctwa does not evaluate its argument.
(gctwa nil) causes this continual removal of truly worthless atoms to be
shut off, but it does not affect whether the next garbage collection
removes twa's.
The value returned by gctwa is a fixnum which is 0 if no garbage
collection of truly worthless atoms will be done, 1 if twa's are to be
gc'ed on the next garbage collection, 10 if twa's are to be gc'ed on all
garbage collections, or 11 if both. (These numbers are octal; the decimal
values are 0, 1, 8, 9.)
↑d SWITCH
If the value of ↑d is non-nil, the garbage collector prints an
informative message each time garbage collection occurs. (In a Newio
implementation, this message is output to the files in msgfiles, see page
3-15) In the PDP-10 implementation, it also prints a message when a space
is expanded without first doing a complete garbage collection, or when a
file or inferior job is closed because a file object was garbage collected.
See also (status gcwho).
See also the user interrupts gc-daemon, gc-overflow, and gc-lossage.
1.6.2 Spaces
In Maclisp the storage used for LISP objects is divided into several
conceptual subdivisions, called spaces. Each space contains a different type of
object. Allocation proceeds separately in the different spaces, but garbage
collection of all spaces occurs together since an object in one space could
contain a pointer to an object in any other space.
For example, in the PDP-10 implEmentation, the spaceq are as followq:
LIST Conses (dotted pairq) and lists.
December 6, 1977 ∪3-1.6.1 Page 3-61¬
**DRAFT** MacliSp Re@→KeK]
JA7∞sWπ⊃α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓%(E∀h@
E!"C"AQHλ⊃I≠⊂π ∃M Fi@a]c@7~p4(Q$α∧4Iye,@(λ⊃MMβw:v\U
λ BIGH
+~α↓απ>sW5βF+π&↑.2bαλ-⊗ =];<d9_ `/ h∂GGβ+Ceβ4¬↔F@]; ⊂_w2⊂ ,ist @MaCGJ8~∀4R↓αNfl∩0≤@λλ⊂.M{:0⊃H9x mbols.
λ∧⊂∀$∧∧E,i0
∧∧λ∩≥-m|h⊂↔Yα various pπSuKβ→1↓↓¬α∩AT∧ _λ4p
p@1K[K]QCiS←αs@~π⎇_
βzz hp@;←→↓β∪zβ;/PhQ↓↓↓α↓↓↓↓αβ#π[*βS#↔≤∧Rπ∨≤6/~βC"AQHλ∩
YRjβ!∧¬∀@↓⊃+≥⊗β P⊂@ ¬εEλ⊂⊂↔.,∧⊂∀!Q"α∧~*$
J∧∧α*|→0⊃Zpp @¬`Kπβ∀ε≡8ε6 3,∧D4Ph ∩αλ∧Q(z⊃∪λ∧
~→(∧92sz[0y⊃ ppgQ⊃←o\Aαc'OQph ⊂@ ¬⊂⊂∀h"ah⊃&⊂"4→P⊃0∪@AKGSC0@ βC,ε6F&|⎇bεF≤8
¬D≥<p∩Y⊂4w bi`≥I%]N@8hP4)↓∧2bB∩b↓↓αSF)β≠≥
g.j∞
W=→≠p≠[⊂64i]⊗⊂:iYp⊂3 /p∧AiK5aP∨K∂∪eβ;.k↔K≤4π6∞β_
b\β*~∀4⊂@A
1!∩D∧α¬&Tε -α7w:[P8:`3hdown lis@PXAkgα+⊃β≠|ε"πε]↑ε␈⊗≡/∩ε@];9.4qP+_v:riKεAεEλ⊂!4w_y<P(≤5sq0[P)x XpP⊂:\pr⊂*≠P47`,d arrays and cOmpilEd co@⊃J\~∀4∀@AaUeJA→%'(XAAkeJA→∪1≥,i1βC-∪∃α~dz:V5bβCWK*α
&≡u*51βπ+K∃αE*:
Qb↓998hQ↓↓↓α↓↓↓↓ααS#↔≤)↓βOε∂↔MαβπK∃αβWO↔ ↓βS=αβOS?⊗)↓↓π+K∃ α↓#K↔∞!7?;gI%↓β&S¬↓ε{⊂∩πMPhR∧∧ααα∧∧ααε≥lFN≡≡LV"α∞O↔ε/5dα¬&
≡2αε≡4αε
lV∂'↑,Rαπ↑<V"πMtαεn≥<Rαπ>\'∨O>LVo~
]w⊗(Q$ααα∧∧ααα∧V&6≤=⊗.wE`α¬≡\Tπε∞|Tβ~kg∃`hPQ$αα∧≥dπ&FT W.gM≤7
ε≥↑εf.\]g&∂M≥vrb∞Mε*π>⊗≡/4↔⊗+!Q hR∧
FO∨D∧ααα∧∧ααα∧∧αα∧=⎇g≡/4¬ε&␈NLV"π≥↔↔~∃Dαεf≡>G~b≡F}n≤4π∨N\-vg~D∧ε⊗N⎇nVo~Dλ⊗v Q$ααα∧∧ααα∧∧ααα∧∞7'⊗≥lw~pQ!PRα
>F∂&≤4¬∨&},⊗>*∧∧α∧∂.,↔O~DfNf↑5Bε∞lDεfNm<⊗>*∞Mrε≡⎇↑εNf\Dε≡}LU`hPQ$αεn≡-6.'MBαα∧∧ααα∧λ∩ππ↑=ε&␈⎇dεfO>Dε}2 I∃≥α
|&V.>N2ph!Q hU≤v*β5Vc∩α∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧αααα62k
fec∩α∧∧ααα∧∧ααα∧∧ααα∧∧α∧&\<Vn⊗↑$β2bε↔∪;8Q bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α¬&T¬∨O>LVjα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hR∧∞Vvn≡-6.'MBαα∧∧αα∧∀∞π/≡Mw>r
M↔∨"
|bεn≤=εNvTF∂&∃Dεv␈D DM≥∧
v⊗V\>G~pQ!PRα∧ f␈&W$αεNd∞FF*∧ W.gM≤7~ε≥↑εf.\]g&∂M≥vrπMW⊗*
≡2αεmtπ∨ε≤<Rε6}$αεw]\&/↔4&.≡≡↑6(h-nVn⊗↑.2ε∂,Tπ∨&},V"ε≥dπ∨.=∧ε
π|∨∩π&≡Bπ&←∩ε&t
f␈"∞L⊗↑*∞↑αε∞o∀ε/GN,∩π⊗⎇⎇Rph!Q"αα
Mε*π∞,V≡O<Tπ∨ε≤<W~ε≡l⊗Nf≤-F*ε≥dαε
⎇↔6.d
⊗oεL]V.wL≡FN}d6∞r,RαεL↑F/⊗]≥f."/⊂hW↑=⊗v:¬∞7&∂N↑2π∨=f∞n↑5∩bα∞>F∂'↑4ππ/.>ε≡v≥\W~JD⊗v"¬∞7&∂N↑2πεMMf∞n↑5∩ph!Q"ααλ≡7≡}=≤↔&.D∧π>OM∧ε.∞=∧απ∨≤6*ε≡4αεNlmw⊗n≡M⊗}rLW&/-]⊗vNltαπ>]bε∞d∧ε∂'L]Wπ"∞MphV≥MF}≡≡LRεNd∞FF∂D∞7ε∞<Tπ≡F}]F"ε<≡W≡*∀ε>∂,,⊗>*=vff\>FN}edα¬&TεN&\∀εO~∧∞FF∂D
vv(Q.6F␈]LBε∞MMv≡∂LTε6␈$∞↔.OLTε
π⎇
⊗f*
≥bαε∀∞7ε∞<UBε∞lDπ&F]dε&.=≤F*πM↔"ε≡DαεO4∞v␈↔M↓PW&Tπ'⊗}\&f*∧
v2εM⎇⊗v:≥bαε←∞ε.w=≡f*ε|≡&⊗∞|Tε≡}MLV∨&≥⎇bαε≥dε␈⊗L↑"π&t∧ππ⊗↑lVw"∞Mε(h.>ε∞≡Tg⊗}T∞W≡Nltπ&}t
V∞w∀&O'4
v2ε≤>G.∞D∞7&␈,≤v*pQ!PRα∧
FF*←ε∞∨D
f∂'↑,Rαε|dπ&F≡4εNvm}&n∂M≥vrπl≡&N/4∧π>OM∧π&FT∞7ε∞<Ubα∧≥dαε
∞∞W≡FM}vph-M↔∨"∧¬πε&E∀π∨ε≤<Rbα≥Fbε≥lf␈⊗\≡FN}d∧εo/>Dε⊗*∧∞7&␈,\Bε≡⎇nFN?]}W≡g∃Dαπ≡t∧π&FT
vvg⊃Q'ε∂,≥V/&↑$ε}2∧
⊗w&↑,W∨"
≡2εF}tαε⊗≤tπ&FT∞ε&b∧
↔~r∧
FFO46∞r∧&*ε\\↔∨/,\Bαε≥dπ&G,\PhW|∨↔~b∞=rπ&↑&*ε≡,Rπ&∞,V*π≡&∞n↑LW↔~≡7≡}=≤↔&.D∞vO&∧∩πεMG hPQ$απεMN6OVT
FF*
nVn⊗↑$ε}2∞⎇w⊗'4
v2πl≥FN"L↔&
≥bπ&Tπε&D↔"πMRεn⎇\Vw"aQ hR∧∞ε&f\∨αα¬MRπ≡∨,Rπ&t∧π>F≤=απ&Tπε&D
V∂J∧w⊗␈t&.6},RεNnLW↔6]nFN}d∧εO~∞,W∂.≡,V"pQ$ααα∧∧ααα∧
FFO4
↔~π↑<V"πMtε&/L\7"ε≥lfNv≡LRπ⊗\>W↔≡≥⎇bph!Q"απMG⊗}⎇T¬&FT∞6OVT&/N⎇lBπ>
≤6BπMRπεMDεn∂∀
f␈"}&␈:
mrεn≡NF/∩∞⎇ε∂"aQ hR∧∧∧
π>⊗≡*∞>V≡B≡2ε
M↔∨"∞>ε∞≡T
ε∂~∞Mπ⊗.T∞ε∂⊗≥\W&/.5Bε≡≥MF."∞Mε*α|7≡O,UBε>=\↔B`Q,⊗v"|6nNedα¬&↑6*ε≡,RεNd
V∞≡
≥f*nL↑ε.vL]g"π]m↔'~
|bα↔⎇}&'~%dα¬&Tε>∨=∨&*α
≡2π&QPV/∞V∨&\Dπ≡O,Tε}2∞Mε*π>⊗≡+4↔~ε|-&.∨N4ε∂⊗T⊗ff|<↔&.D
⊗rπMRπ∨≤6*b
≡Bαπ⎇≥Fbεage collection will occasionally be required, under control of the
other two parameters.
The gcmax is the maximum size to which the space should grow; if it gets this
big garbage collections may occur quite frequently in an attempt to prevent it
from growing bigger.
The gcmin specifies the minimum amount of free space after a garbage
collection. It may be either a fixnum, which specifies the number of words to
be free, or a flonum, which specifies the fraction of the space to be free. The
exact interpretation oF this depends on the implementation. In the P@P-10
implementation, which uses free storage lIqts, the gcmin is the number of words
¬
December &, 1977 ∪3-1∞6.2 Page 3-63
**DRAFT** MacliSp Reference @≠C9kCH@@@@@@@@@@@@@@@DU⊃%β
(αQ($(hP4+←FK∂!βo+OQβ⊗)β?9¬##∃β4ε&.
∞:F␈⊗≤|Rεf≡:Bε∞nLW∩ε∀λ l≡XX9lT_{s
L8⎇~-⎇KHλ ≤β⊂:4→y2P0\2FE .ot this many, @QQJ@AMaCGJ↓SfAOI←o\X↓KqGKAhASLASif↓cSuJ↓Caae=CGQKLAOG[¬p@ASPA[Cr4∃]←h↓EJAOI←o\A r@Ai!JAMk1XAC[=k]h\α↓α'9αβS#∃∧kW3SN≠@~ε≥↑εf.\]g&∂M→vrb∞⎇εN≡∧∧π/≡↑4ελh,=voε≤>FNvtλv∂⊗,≤v*ε=⎇Ff.>Mw∩b∞Mε*ε>-↔&/-≥vrεmz"ε>≡,&∞>Tλ6}fL\7&N⎇dεO~
mw"π⎇Vrε⊃Q&7⊗\TεfO>@εO~[εF∂↑>F.".W"π⎇VrπMRπ∨≤6*π,\⊗≡F↑4ε
ε<↑'&∞≥dπ∞O,Ubα¬M
↔~α∞=↔V*
~0hWMRεn∨
⊗o.T
v2ε|>6OVT⊗v"∞Mε*π>]Rε}d∞FF*∞=↔V*≤g&/$λ6}o≤7&Nm≤6∂&≥⎇bαπ
NW~ε|=VNpQ%εN2
≡Bαε≡4ε
εm∨εw.U∀αε␈$∞FF*∞=↔V*∧⊗7&↑$ε≡}↑⊗∨&≤m⊗≡∂M≥vrπM≥V/~∧ε∩zC∃\v≡n≥e∩αF≤aPV>=]⊗rε≡4ε
εmMvw.Ue∩¬&Tε.6l\7"ε|dπ&F≡4εO~∞Mrε∞MMw:πMRπ≡≥\Rε∞]}Vw"
|bε∞MMv≡∂M≥vph,,W'>\]bε>≡,&∞>T6}fL\7&N⎇n2ε∂4∞FF/,Tπ>␈]LBε⊗T
⊗rπMR¬∧J¬Sα∧
⊗oεL]V.wL≡FN}d∞vO&↓Q'&FT∞6∞nTv≡n≥e`hPQ$αα∧m}F*πM↔"πMW≡*=vw'-⎇G~ε}lW∩πMRπ≡∨,W~ε|dπ∨ε≤<W~ε≡,Rπ≡⎇\W>F≡DεNv←⊗∨"D∞6Nv<QPW&↑&*ε≡4π⊗␈]lFNvudα∧6}$εNw>L⊗v≡UDπ&FT
∧%αV⊗αεN↑
F.n]nF∂&≥⎇bαπ∞,W≡.nMGJε≥MF}≡≡LW_h-\Vn␈/∀π&z∞>ε∞≡↑4εNr-F}≡>4ε}2εV∪∩r∞⎇w⊗'5dα¬&T∧o.NM⊗∨~∧
⊗oεL]V.wL≡FN}d⊗ff|<↔&/1Q&∂"
LV∂∨D∧β37εBrπ⎇}&'~∧&/'|\Vrε|≡&⊗∞|Tε≡}MLV∨&≥⎇g~α≥f"π∞,W≡.nMGJα=vw'-⎇G~πMPhW=∨&*ε|dππ/=F␈>d
FO∨N4εNr-F}≡>4ε}2ε⊗brπ⎇}&'~aQ hR∧∧¬≡}\Tπ∨ε≤<W~b∧∞7.≡∧↔~∧-≥f∂↔∀∧¬π⊗|}&∞j
>ε∞≡T
⊗rα∞Mε*¬λJαk∧∧εNo
LVn.nL↔&N⎇dε␈⊂Q*7&∂M≤2π∨M}&∞>T
⊗rπMR∧o]NFN∨4
⊗oεL]V.wL≡FN}d↔⊗*
mw"π>\&V.>Dπ&zLW&∞≥LV"ε=⎇g'⊗⎇APV↔∀∞FF*∞↑6/∩d∧¬&FT
V∞v≤|Vn.nDαε}d∞FF/<Tπ∨ε≤<W~ε≡4ε.wM≡&.g∀∧ε∂/M⎇V∂&≤5bα∧|]f/⊗≥MGHh.Mε/≡T↔⊗*∞>ε∞≡↑4π>F↑,Rπ&Tπ⊗∂LTε}2≥Ff}<≡FN}d
↔~εl≥↔⊗g∀∞εf∞=≤Bε∞lDεn␈>Dε}⊗,\7'~AQ&}v<Tε∞fM|6∂&\EBε∂,Tπ/≡\Dε6␈,↑f/∩∧⊗v"
lW6/$g⊗.\Ebα∧]f≡*∞Mε*ε←⊗∨"∧∞ε}f≤?∩π/<\@hVm}"π∨M}&∞>T
V∞v≤|Vn.nDεNr∞Mε/≡T∞7ε∞<↑2εO4
f␈"∞Mvzε≥↑ε␈↔L≥g"pQ!PPh&∃c2s4∧¬∨&},⊗>*λ=vw'-⎇B∧7]l7&N⎇n0hPQ!PV∞MMv~α∧∧ααα∧∧ααα∧∧α¬≥X*"β
≡&8h!Q"αα∧∧ααα
Mε*ε≥MF}~∧g.v>M⊗}r
≡2απ↑<V"πMtαε/≥VNvT⊗v"∧∞6/"∞↔⊗∞\↑F/↔4∧ε}2∞l↔⊗N}↑0hR∧∧ααπ>⊗≡/4∧εF∂m≥f:α∞Mrε&t∧π>OM∧απ∨M}&∞>T
V∞v≤|Vn.nEbαα
Mrαπ<↑Bαπ≡&∞n↑LW↔~D∞FF(Q$ααα∧↔⊗?]\Vw"∞Mrε∞MMv~π=
w.fD&*α∀εfO>Dε≡}nL⊗Nv≥lrε∞dW6.d
g.n,↑"αε|dε.f]\Vw'5aPRα∧∧α¬&Tε6O.>Bαε]LVn.nDε}2∧∩πε≥≡"εO4∧π&FT
f∞nT∧ε}2∀π∨ε≤<Rbα≥f"πMRαπ<\6}vD
↔_h$∧ααα]↔&F↑$ε
αm↔Fw]Tε␈∩∀αβ~]M↔∨"d∧∧
αm↔Fw]Tπ∨ε\=⊗6N↑4π&FT∧πε&M\↔Bαmw∩α∀πε&AQ"αα∧∧π∨ε≤<RJε}$π&FTv∨≡∨,Rε∞lDε>≡\∨ααFm}"ε␈MW∩π>⊗≡/5e∩∧
ε5VfO>Dπ∨ε\=⊗6N↑5Bε7-⎇PhR∧∧ααεL\g"πMtπ⊗N⎇∞BbπMRε>>=↔V*Dv≡n∨¬Bε∞lDε>≡]≥brα
m⊗bε\\⊗w~∧,F}r}Dαε≡≥f>*∞MεO_Q$ααα∧∞ε∂⊗≥\W&/%d"α∧}Mε/↔⎇≡6*α∀ε6O
nVjα
↑W∨"∧&*π>↑πεf≤\Bbα←ε≡/∞DαεNd∧π&FT∞FFO,APRα∧∧αε.L]V.wD¬π&FTv≡n≥e∩bπ⎇W⊗*∀ε6f⎇nVjε≡4ε∞≡<↑π&∞-LRrαλ∀β~nM≡7"ε<≥fv␈D&*π↑<V h$∧ααα∞⎇↔&B∀πε&D∞7ε∞<U`hPQ$ααα∧∧αα∧≥dε/F≥↑εf*
|bπ&
≡2π/<Tε}2≥Ff}5DεNr∞Mε*¬λJαk∧
⊗oεL]V.wL≡FN}g!PPh!Q%ε∞|Tβ~kfDααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α↓≠5V∩s2f$ααα∧∧ααα∧∧ααα∧∧ααα∧λF.≡]\&/∩εeBβ⊗vphPbR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α¬&T¬∨O>LVjα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jA"Ph!Q hPQ$ααα∧∧ααα∧¬ε∞fM|2α:
M↔∨"¬ε3ββ∧¬bβ+εεαrβ¬f#*HQ$ααα∧∧ααα∧∧ααα∧∧αααm↔Fw]PαC#εεαrβvεβαr
m⊗bHQ$ααα∧∧ααα∧∧ααα∧∧ααα∞?⊗n⊗⎇Dβ3βε¬`hR∧∧ααα∧∧ααα∧∧ααα∧∧απ⊗\}ε&bε&ββαe∃⊂hPQ$ααα∧
wαb
≥bπ&T∧o.NM⊗∨~
≥Wεf]\Vw&≡M⊗}s!Q hR∧∧ααα∧∧ααα≥Ff↑4∧rFf≡>BαC4εββαd
fNbε¬c~HQ$ααα∧∧ααα∧∧ααα∧∧ααα
\↔⊗↑\Nε&bεVββαβC"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλ≥-m8<Zl\≤→≠∧ε,¬e*#"AQHλλ∧∧λλλ≥≠≠xd
8>(∧;_{dY(λ<;≠→,D≥z=
∧λ_;D<Y⎇-\9]λ∧
yH≥¬Dλ≥z
≤zλ_l≡<y4d∧~=λ∞Mc"H∧∧λλ≤L↑≥<[D(≠~.>λ≠yD∧_;≠∧∞~→(∞>_8y.∀_;Y∧∞~→2.∧λ≤_.,995↑\kH∧
~~<d
~<⎇∧
<hλ
≥H_#!$λλλ∧[|[$∞⎇8z∧∞~_=∧
=λλ=⎇;→∧Y(→m≡Y;H,8zh∞Mhλ_-M≠xh≡λ≤{m\(≠_.L<H∃
≥9(λ∞MβP9r]εA⊂⊂λ⊂⊂:4→P80y_vrz2\9P10XuP:7H;t0zλ:42lH0y2P≠7{WεBεEεEλ⊂⊂)bYP80sYP→V\∞P⊂3'\⊂9wvYP9z0]:yP⊂→8w1j~ww9P≥t4qtλ0y2Pλ92v0]2r⊂:≠P:42H⊂:7x~qP7sβE9z7\0srP≤x0qr\WεEεB∧E_W
↔~⊂⊂⊃<s0vZqP)x_qrP0[2⊂("≠⊂"|8_w9tg[εEεEβE⊂⊂⊂∃42y2H0y2P≤r{2y_v⊂:yYy⊂⊂4[:2y9≥x:9P→rw2y_z2r_<P:4→P9z7\0srPλ6pw0Yrvrg≥↔⊂⊂)YrFE9Yqz4w[⊂80sYP→VXM⊂37iλ0P22\qy4x≥4ww⊂≠s⊂:yYy⊂4w≥2y9:\:9W⊂λ*42P→qVr0Yvww⊂~w:2y≤:x:εB7qqj\9P⊂0Y:2y⊂→pqt⊂λ3py1_srP1[v62q]4ww↔λ⊂⊂*4→P0y3]vrw:λ⊂80y\rr⊂:≠P⊂:4→P3qVY0rvw[εE4w≥2y9:\:⊂⊂4_w262\⊂⊂4yH⊂0P⊂≠4yz⊂λ7s⊂⊂≤x0qr\P⊂0w→⊂⊂:4→ty⊂⊂≤t⎇2yK⊂⊂⊂$[⊂⊂:4→P("(XXεE~vx62[rw:0]4ww⊗λ:42P~z2vyH7w⊂:~2P⊂6~yz⊂0\2P7sλ:42P→7y6]λ⊂∀9x_qrVw_vrP3≤2rVq→s7y2CE392YVps:→y⊂9t↑2Vq2Y7y2Pλ9t⎇2Kps:2\∀V⊂;Z2y2Pλ9x0qYP4yPλ:42P≠0vrPλ7s⊂0H⊂9x0XrV⊂0[2εE3≤2rVq→s7y2H4w24Xpz2yH:42P≠:vq2\⊂7s⊂_rv69H392rH12s7\2P:4→P3py_0srP_wv62Xz4wwλ0w2εB392rKps:2\⊂4w2~qpz2\P:42H7:vq→y⊂7sλ1rv6≤P392YP0s:→y;py→9W⊂⊂∃42P6_yz⊂⊂≥;wP7≥vq2y≤FE0y→P:42H9t⎇2H7s⊂:~2P9x_qrP∀≤rrP∀≤z0z:\P9x1\t⎇2TJP12s≠y2P0[2⊂0s≥2y⊂:~2P⊂#PW⊂⊂∀∃42FE≤t⎇2yH0y2P~w⊂("∀⊗XX⊂≥wy29K∀P$wλ:42P∪zv:4XyP4v\62vr[:0z4[w⊗⊂:~2P4j→vyP0\2P⊂7Y⊂:42CE37y≠]⊂⊂⊂
9x0qYP12s≠y2P⊂⊂⊂0s≥2y∀Wλ⊂$w⊂λ:42P∪zv:4XyP⊂4[x62vYw:0z~ww⊗⊂λ;t2y→P⊃39→rFE1Yv69Qλningless concept, only the difference of these two numberq is
significant; it represents the amount of compaction achieved.
The gc-lossage interrupt occurs if the garbage collector tries to expand a
space but fails becauSe, for example, the operating system will not give it any
more storage. The argument passed to the interrupt service function iq the name
December 4, 1977 ∪3-1.6.3 Page 3-65
**DRAFT** Maclisp Reference Manual **DRAFT**
of the space that lost. If the interrupt handler returns, the value is ignored,
and another garbage collection is attempted.
The pdl-overflow interrupt is signalled when some pushdown list exceeds its
pdlmax. The pdlmax is increased slightly so that the interrupt handler will
have room to run. The argument passed to the interrupt function is the name of
the pdl that overflowed. If the interrupt function uses too much pdl, this
interrupt will occur again. If this happens enough times, the pdlmax will reach
the pdlroom, there will be no room in the pdl to take a user interrupt, and an
uncorrectable error will occur.
The interrupt function can decide to terminate the computation that
overflowed the pdl, for example by doing (↑g) or a throw, or it can increase the
pdlmax by using alloc or (sstatus pdlmax) and then continue the computation by
returning. Note that, unlike most other user interrupts, if the pdl-overflow
interrupt function returns nil (or the ";bkpt pdl-overflow" is $P'ed), the
computation is continued as if the pdl overflow had not occurred.
The gc-overflow interrupt occurs when some space (other than a pdl) exceeds
its gcmax. This gives the user a chance to decide that the size of the space
should be increased and the computation continued, or that something is wrong
and the computation should be terminated. The argument passed to the interrupt
handler is the name of the space that overflowed. The interrupt handling
function will be able to run because the garbage collector makes sure that the
space is sufficiently large before signalling the interrupt, even if this makes
it become somewhat larger than its gcmax. This interrupt is similar to pdl-
overflow in that if the interrupt handler function returns at all, even if it
returns nil, the interrupted computation proceeds. To terminate the computation
an explicit (↑g) or throw must be done.
1.6.5 Initial Allocation
The PDP-10 implementations of Maclisp run on a machine with a limited-size
address space. Consequently the allocation of portions of this address space to
different uses, such as LISP storage spaces, becomes important. This is
particularly true of the DEC-10 implementations, which cannot take advantage of
paging.
When LISP is first entered, it goes through a dialogue with the user known as
"allocation." Normally the dialogue simply consists of the user declining to
Page 3-66 ∪3-1.6.4 December 6, 1977
**DRAFT** The System **DRAFT**
specify anything, in which case LISP chooses suitable defaults. If a large
problem is to be worked on, the defaults may be inappropriate and it may be
necessary to explicitly allocate a larger amount of storage. It is also
possible for the user's replies to come from a file.
If LISP is called with a command line from DDT, for example
:LISP INDEX LOADER COM:
it rea`s the iNdicated file in the same way that it would read .LISP. (INIT).
See below.
On the other hand, if LISP is called without a command line, it identifies
itself and asks
ALLOC?
*****SAILB*****
Suitable responses are Y, N, and CNTRL/q (in the SAIL implementation q and Q
are synonymous with CTRL/q). There are other obscure characters which can be
used as replieq to this question, but these three are sufficient for most
purposes. ("?" causes a list of suitable responses to be printed out.) "N"
means thatyou do not want to specify allocation. You will get the default.
CTRL/q means to read your iNitialization fIle (see below.) "Y" means that you
wish to go through the following sequence of questions and answers.
*****SAILE*****
LISP types out the names of various spaces and their sizes. If the name of
the space is preceded by "#", then it cannot be expanded once allocated by this
dialogue. After each question you may enter altmode, which terminates the
dialogue and gives the remaining parameters default values, or space, which goes
on to the next question. Before your altmode or space you may put a number
which iq the size you want that space to be, instead of the number thatwas
printed. CTRL/g restarts the dialogue with the "ALLOC?" question.
****SAILB*****
If you reply with a CTRL/q, it means to rea` your initialization file. In
the ITS implementation, this is either udir9 .LISP. (INIT) op (INIT!; udir
.LISP., where udir is your Master sname. In the TOPS-10 implementation, this is
LISP.INI in the directory you are loeged in to. In the Multics implementation,
this is hd>start←up.LISP, where hd is your home directory. Since the Multics
implementation doesn't have the allocation dialogue, this file is always read
when the LISP command is given with no arguments. In the SAIL implementation,
the file will be LISP.INI in your aliased directory. Moreover, LISP.INI must be
in /N E format (no directory page).
*****SAILE*****
The first form in the file should be a comment which is used to answer the
questions. Note that supplying nonexistent space names in the comment doesn't
hurt, so you can use the same comment for different implementations. An example
of the form of this comment is:
December 6, 1977 ∪3-1.6.5 Page 3-67
**DRAFT** Maclisp Reference Manual **DRAFT**
(comment fixnum 5000 symbol 4000 flonum 2000
bignum 1400 regpdl 5000 hunk8 30000)
The remaining forms in the file are simply read and evaluated using the
standard read-eval-print loop.
Page 3-68 ∪3-1.6.5 December 6, 1977
**DRAFT** The System **DRAFT
*
1.7 Implementing Subsystems with Maclisp
1.7.1 Entering DISP
α
A subsystem is an entity that exists in most tima-sharang systems. It is
normally a complete world which the user enters by typing a command. He then
has whatever dacilities the subsystem offers. A subsystem can be oRiented
toward programming, as the Maclisp subsystem itselF is, or it can be oriented
th∂oCIHABAACeiS
kYCd↓CaaY%GCiS=\XAM=dAS]MiCMG∀AG←[ASYS]≤A→∪'@Aae←≥eC[f0A←aKICiS]≤~∃KC
QS]KIrXA←HAg←YYS]NA⊃SMMKIK]iS¬XAKcUCiS←9f\~∀4∀@@A5CGYSM`@ASL@AMe∃ckK]QYr@AUgKH@↓Cf@A∧@AECMJ@A←8@AoQ%GP@AQ↑@AEUSYH@↓gkEgegiK[L\~∃π=]gKcUK]iYdAShA!Cf@A KK\A∃ckSaAKHAo%iPABA]k[ KdA←_A[KG!C]Sg5fAoQ%GP@A¬YY←n↓iQJ~)gkEgegiKZ↓oeSI∃`Ai↑↓OCS\↓G←[a1KiJA
←]ie=XA←m∃dAiQ∀A←aKICiS←8A←LA5CGYSM`XA[¬WJASP~∃a←MgSEY∀Ai↑@↓QSIJ↓iQJAYCOCe%Kf@A=HA≠C
YSg`AMe←4AiQJ↓]CSm∀@Akg∃`A←LABAI%MMKe∃]h~∃MkEgsMiKZX↓C]HAAe←mS⊃J@AS9GeKCMKHAK→MSGS∃]GrA%\@A[∃[←er↓C]HAAe←GKMg←d@↓kgCO∀AM←d4∃QKCYSYr[UgKHAMkEgsMiK[f8~∀
∀@@@@@@@@@@@@@@@@@@@@AS\AQQJA∪Q&AS[AYK[K9iCiS=\~∀~(@@A→%' A[¬rAEJ↓K]iKIKHAEdAiQJu→∪'@@Q←d↓→∪'!y⊗RAG=[[C]⊂\@A)!JAK]YSe←]5K]hAβ≠↔Qβ/4+JβS#'~β∂?7n;⊃βO→βS#*↓βOS∞s∪πK"β';'&Kπ1β.s['K}s7↔;"q↓α2M~Aβ;␈9β∨?/→↓βSG∪?W∨Bβπ84V33?≡S'?rβ∪'πf{↔W∃ε;⊃β␈βS'?v33eπ∪↔π∪~βg?W∩↓:2&≥↓9↓"Lr&Q%ε3'3∃r↓αO↔*βCπ∨*↓M5Y h+≠?∩β';≠␈∪7πSN{9β?rβS#'~p4(∀R↓↓α2M~A↓βneβ*↓β↔;&+K↔⊃ε∪e↓β&C∃β∂}k7π;"↓↓j2M~Aβ;∞k∃E↓εsπ7∃∩β∪↔Yαβ∪'Iα↓#?IβR2&Nh+∪↔3S∪'I↑sπ7∃
β;π7+⊃%9↓∧K9βSFKMβ∂∂≠∃βSF)β≠'f)β∪↔3S∪'I↑sπ7∃
β;π7+⊃β'Mπ∪↔π⊃αβ'9β&C∀4+≡7∃β>eβπ~↓β¬↓tb&NAr↓"&:M!%β≠Nc∃9↓ααS#'~β∂π9ε∪∃βW≡+⊃↓β&yβOS∂∪QβWα↓β¬β∨+Og∨#↔58hRS#∃ε#↔['≡)β∪↔6W3S~↓βS=∧"N-1π##∃β&KK↔∂&{Ke↓ε#↔≠π.cSMβ&yβg?/⊃β∂W↔∪↔;Qαα∩∩QεkπOS/⊂4+Ov7∃↓Bq:6Nt
6∃%bβπ;⊃π##∃β6K3∃βv7↔Mε#↔≠π.cQβSz↓:2&≥↓9↓"Lr&Q%ph(4)α↓α'QεKMβπg≠=βC␈≠O'f)βS=ε∪W'3"β¬↓β∨+Og∨#↔5βNqβ¬αdJNA1π##↔9π≠π[∃εKQβπ~↓αRM∧2>=8hRS#∃α↓j~>z↓↓#?∩α~>>tY%↓β≡{77πv!↓β←Nc1↓β&C↔9β.sS↔IαβS#∃αβOW∨KOS↔ja↓βOβπOONs≥βSF(4+πfc?∂π&K?9β&Kπ3??+∃84Ph)↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓β'rβS#∃∧"⊗
5↓β'7εc↔7↔w#πS'}p4(4R↓↓α2M~A↓βne↓β⊗)↓β↔w#↔K↔"βe↓π##∃↓εk?;'&{I↓β≡{77πv!αI↓∧b&NAαβ?I↓¬∩V9↓∧b&NAr↓αS#(h+π3f{∂πSN{9β∪N3?∨.)↓#O.)↓βC∞;∃↓Mk1Q%βO→β↔;&+K↔⊃r↓↓α?π#'?;∞c3eβ
α2&Nαr&:%αβ'9β&C∀4(hP4*∪.≠↔7/⊃↓Y1β e]]α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓↓→M5Es9↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓αε∨∃↓~iYd4P1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓∧kπ∂3O≠AαK.3↔K↔v≠∃α7∞sWπ1α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~"Q(4(hP4+W≡+I∨Mαβ∪'K.≠S?KJ↓β7πJ↓β∃αβK↔π"q↓↓αN1βS#*↓α∩⊗~iEA↓εk?;'&{I↓β∞c3?←~↓βS#*↓βWO*β?_4V∪∪'&K?;πbβπK∨.k↔;S~β?9β&C∃αIε≠?77∞s⊃↓βfK;∃1π##↔9π##∃βεKS'∨+3πIεsπ7∃ε{→↓β
β≠'3(h+7πJβ∃β∨β↔∂'6K↔⊃↓αCWQεs?Qβ
β∪'K.≠S?KJI9↓↓¬##∃β/CS↔;≡K?9β&+≠πWg#MβSz↓α&:Jq↓αSFKL4+6K3∃βO→βK↔∞!β'9π##∃β≡7∃β>eβπ~β¬α2M~A:&tIβ≠'f)9↓α&C'Mβ≡9β*βWO↔"βS=β∨#πKQπ+Aβ∧hSOW∨KOS↔jp4(4R↓↓απ~β'9β&C∃α&%→↓β'oβ3↔7.sSπSN{91β
βOW∨KOS↔jβ∂π9αβ∃β≡[↔⊃ε;⊃β&C↔9↓εK;[?↑+⊃βHh+S#*βπCC⊗{CK'∂#∃αIε{IαJ,qβ∂?nkπ;⊃ph(4)RQ))*≤
&2 RQ))(hP4)↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓β'rβS#∃¬~ε&1εK7C3.k↔;S∂#'?8hP4)↓αα7π∂fKOAβO→βKWrβπQα≤
&1β↔Iβ'O∨+';≥π##∃βn{;'S␈⊃β∂?nkπ;⊃¬⊃α6ε≤bNA9∧K9↓β∞#∪'SN{904V{;∃β≡9βOε+∂'≠Jβπ9βNs'S'fKkπSN{9β≠Nc∃βJβOπgNs≥1β6{Iβ'w≠Sπ;≡)iαI∧jε∞2≥↓n~>zq↓α'ph+S#O→β∂π≡)α~>zr&:%αβ?9β&C∃βπfKπO↔"↓β∪'⊗+∂S?↔Iβ←'fa↓β*βK↔π"qα~>zr&:%αβ7WO"β∃↓εK84+∨#π;∪∂∪⊃↓:Lr%β≠␈∪7πQαC%;∃rβ7WO"β↔∨Nqβ←'&Aβ¬α≤z66⊗u!βOS∂#↔7↔w!βπ;"β7WO"β∃βNq↓>8hR∃β≠␈∪7πQrH4(4RQ)))U~ε&2*Q)))Ph)↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓β'9π##∃αo+3S'∨→β'7εc↔7↔w#πS'}p4(4R↓↓αSF)↓α7∞≠3'OαβOW∨KOS↔j↓β'Mε+;S↔⊗+⊃↓β↔Iβ'O∨+';≥αβS#∃∧b&NAαβ∂?7n;⊃↓εQα7.cS'∂_h+∂?nkπ;⊃εc↔[↔bq↓↓αN1α2&≥↓β'Mαβ∂π3f+⊃β←O#!↓βvyβπK?+7↔;'→1β¬αβ∂?CJβ?→↓π##∃β∨#π;∪∂∪⊂4+Ns'S'∞aβ↔;6KK?;n+;Qβ≡{;SπNs';≥αβπ31π##∃β∨KOS↔j↓β≠Wv≠S'?w→βπ;"β[πKN3↔~↓β'Mεkπ∪∀hSS#∃ε≠WKK.sQβ↔w3'K?vk↔;Qr↓↓α'2βS#∃∧b&NAε≠?77∞s⊃↓βO→β'O∨+↔⊃β>KS!β∞q↓βπ⊗;W7↔w!1βSF(4+π⊗;W7↔w!β∂?v≠πS↔vS↔⊃αβ←'SB↓ ;O2r2&Nα⊃↓β'~βS#∃πβπS#v7∃↓ε{→β¬αβOπ[.!β↔;6KK?;n+;P4W;#'∂B↓β'Mε≠?C'.!↓β'w#=βSF)↓β∂/∪K↔;"β↔;[O∪?;7.sQ9↓ααS#'~βOπ[.!↓β↔w3'K?vk↔;Qπ;?W3 h+∂?w#π'9π≠?7∃π≠WOO≠S↔5bβ←#'≡Aβ←'faβK↔≡+'[∃ε≠?;S⊗{19↓∧∪∪'&K?;πbβπK∨.k↔;S~βS=β&C∀4*dJNAβ≡{77πv!β'9π##'Mε≠πO∃εK∃β∞≠SWπfceβπ⊗;W7↔w#MβSzβS#∃π≠WOO≠S↔5ph(4)α↓α?≠&+9β?v)β∂?w≠SKW∨#M↓β
βSK'6Kπ1β≡{77πv!β≠?∩↓β∨↔'#';≥εK;S=ε ↓βO.∪OgO&+51β>C'∂ hSO'7εceβ∂∞c3Mβ&C∃α2M~Aβ∂}k7π;"β←'SBβS#∃π∪'∨#"βπK∨.k↔;S~p4(4R↓↓α≠␈⊃↓β'w≠Sπ;≡)1↓β&C∃↓αdJNA↓ε≠?7CNc↔I↓π≠WOO≠S↔5αβ7πeαβ∃↓ε+;S↔⊗+⊃↓β&CK?W>AβS#(h*2&≥α␈∂?oβ'3↔∩↓β∂?nkπ;⊃b↓β←#N≠!↓β≡33Mαα2&Nα↓β←'&A↓βSF)↓βC∂##;πn)↓β?2↓βS#*↓βOπ6+⊂4+.s['K}s7↔;"↓β∂?w#π';Ns≥↓β&C∃↓αdJNA↓ε≠?7CNc↔I↓εM↓β&C∃↓β6KKOQαβπK∨.k↔;Qb↓βπ;"βS#∀hSπK∨.k↔;S~βS=β&C∃α2M~B␈∂}kC'3/⊃β∂?nkπ;⊃εMβSF)βK↔n';'v9βπK?+7↔;'→84(hQ↓↓α>C↔9β&C∃βO&;∪π⊗!β';O#'π1αβ↔;[O∪?;7.sQ↓#Js∃9β&C∃β?⊗#';π↔I↓α7∞≠3'OαβOW∨KOS↔jH4+'~↓β↔;&+K↔⊃bβ'Q↓ε≠#↔∂←→β≠?∩↓β¬β≡+∨7↔w!↓β;∞k↔⊃β∨#πKR␈+A:2M~A↓βNqβS#*↓βWO/⊃∨MβF{7∀4V#'K↔∨#?Ker↓α'→π≠W∂!ε ↓βO.;7↔;"β↔c'∨#M1βO!β'MαβK↔π"β'91π+O';:βS#∃αβ3?π"β≠W;∨#'?9ph*S#O→β≠πlity allows users to "customize" LISP.
1.7.2 Saving an Environment
A subsystem is constructed by the following procedure. One starts with the
obdinary Maclisp subsystem, and defines a number of function definitions and
varaable values. This creates an environment which is capable od implementing
the desi@IKHAgUEgsgQKZ\@↓)QSf↓K]mSI←][K9hASf↓iQK\↓gCmK⊂AS\A∧AMSY∀X@AC9HA]K
KggCIr~∀~(~∃!C≥J@fZ\`@@@@@@@@@@@@@@@@@@@@@@&LZb\n8b@@@@@@@@@@@@@@@A KG∃[EKdlX@bdnn~∀_TU Iβ
(T(@@@@@@@@@@@@@@@@@@@@A)QJ↓'sgi∃Z@@@@@@@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∃[K
QC]SM[fACIJAgKP@Ak`↓g↑Ai!ChAC8@A←a∃eCiS9N[gsMiKZA
←[[C9HAGC8AS]m=WJ@A1∪' A¬]H~∃
CkgJASh@↓iV@AMKh@AU`@Ai!JAK]YSe←]5K]h@↓gCmK⊂@AS\AiQJAMSY∀X ↓↓¬;#↔9αβS#∃π≠π[↔ h+↔;6KK?;n+;Q↓εKEβ'w3?/↔"↓β∂?w#K >D ↔
α∞↔∨≡\@π&Z∧∞FF*jVv∨M≥vw~∧
⊗rε≡Dαπ>
≤6BπMVph.
&}≡\XBπ&tλFzπMRε↔↑=⊗v/>4ε}2∞Mε*π>\'∨O>LVjPQ!PRα∧
FF*∧WF∞>Dαπ>≥∀ε}2∧∞6∂6≥lrαπMRε.nm↔ε}m\Vw"∧FN6lZ'
αj&}j∧
⊗oεL]V.wL≡FN}d
Fxh-≥Wεf]\Vw&≤M⊗}rd∧∧Nr∞Mε*∧↑]G&N>4εNo
H -\9]_.M;{@∞M→<Y$
<h_$];XnM9{@<;≠→,D≤x=LWA"C!.x=P∩H⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ#)ba∀εEεEλ⊂⊂⊂⊂λ⊂⊂∀9X{2P⊂→4πo) sav@∃`
↓β&C∃↓β≥+CK↔w!↓α∩M~A↓β,s['K}s7π≠ ↓β'9αβ¬↓↓∧∧fNfT∧εv∞\X ↓QHλλ∧∧→[se@9{↔&∩ih⊂4[⊂:42H⊂;wi~βifg↓ISeK
iWer8@AM←αy↓β'~β;?Q∧+[π3.S↔⊃p↓↓αSF)βOπ4¬⊗v8Q$ααα∧ wε/,≡FN}dF/∨N-wO~∞Mε*π⎇}&@=9Y`⊂_wx<P≠s⊂:4→P2w;~y7w6Yw:⊗⊂≤wP;t→w⊂:4→P9p{→P4yFB⊂⊂⊂⊂λ1wvx≠2z2P∪$ih⊂≤2z:i≠9P:7H&zv 4ics Command level.
All variable values(λ@A→SYJ@↓←EUK
ifX@↓CeeCd@AG←αsS↔;'→1↓↓ε;⊃↓ε3W;∂&K?84R↓↓↓↓ε#↔≠'vKS'?w→↓#πv!β?SF+IβC⊗{C↔K&K↔M%∧K∃β≡[↔⊃bβWQπ##∃β≤{;S↔w#Eβ?2↓βS#*βCWO@h)↓↓α↓β∪?>qβ3'∨#M!βNs∂3W&K;≥βπ∪↔['␈+Mβ[∞cWπMε{⊃β␈+;⊃β6K'π⊗c↔M1∧≠π;;⎇!↓β*βOπ[,!04)α↓↓↓β≡y↓βO∂3∃βOF{W3⊃αβ?;3Jβ∃↓π+O↔⊃ε3K?5αβS/Aεc↔[↔bq↓↓"≡+∃βπg≠=↓β&C∃↓β≡+∂S'}qβ?8hQ↓↓↓αα∨π'vK;≥β∞s⊃α/.+C';8απ?;'∪?11ε∪↔3?:H4(4Ph)↓↓∧K9βSF)αB∩αiEAβNkC3↔n+;Sπ&K?;Mπ##↔K*β'Mβ
β≠W;∨#'?9ε≠π33.!βOW∨β↔;⊃Ph(4+∨+OC↔v!↓↓↓α↓↓↓↓α↓↓↓αe~V
Iβ↓βS=β⊃βπK?_4(∀R↓↓↓↓α↓↓βO/≠C↔;"βCWS~↓α2&≥↓β'9ε ↓βO&S∃β∨+∂!↓π##πQεKQβ∂∞q↓β*↓jB∩,jA∨↔"↓↓"&%→%β?⊂h)↓↓α↓αNN
2∃∨⊃α↓"α⊗~iEA%αβπ;⊃αβ3πS/⊃↓βK/≠SπK&+⊃9↓¬;#↔9αβS#∃αβOπ[.!↓β∂␈∪∃↓βNkπ∨∃εKL4)α↓↓↓β⊗+OSπ↔#↔⊃1αβ↔[↔↔KS#'v9β←'fa↓β*↓βS#*βOπ7*↓βπMαβ'Qβ>M↓β>C↔9↓π≠WOC.s∪↔⊃bβπ;⊂hQ↓↓↓αβ∂?;'∪?1β>K31β⊗+SWKrβ≠K?jβS#∃εK;[?≡S'?rβ?→β∨+OC↔v!84(hQ↓↓↓α↓↓↓β∨+OC↔v!β7πJβ∃β/≠↔⊃β∂!βπ;JβC?'w!β'9ε β∂?oβWSπ&K?91π;'S!αβS#∃π∪↔OS⊗K∂S'}p4)↓α↓↓βSFQβ;z↓α%>zβ∪↔[N≠↔M↓ε{S#↔∩βS#πr↓βS#*βS↔KnK;π1εkπe↓ε∪∃β'r↓βWO*q↓α'2↓βπ9∧I><4R↓↓↓↓ε#↔['≡)β?SF+I↓β&Cπ9β&C∃↓β&+K7'v1β'~↓β'9π+O∃1αβ¬β≠∞K17π∨!↓β∂␈∪K↔∂&3∃ε+KK?⊂h)↓↓α↓β?∂∨+KM1εK;∪'≡S';:βS#∃ε{≠≠↔v#';≥ε#↔['≡)#M%ph(4)α↓↓↓↓α↓α'9π##∃αM"M↓βNkC3↔n+;Sπ&K?91ε≠πK∃εKMβS∞[↔9↓π≠=βSFQβπfa↓βO.∪OgO&+7Mβ≡[↔⊂hQ↓↓↓αβ←'SBβOWOε+;⊃β7∪?5↓π##∃β≡7∃β6+KO'}q↓β?2α2&Nαβ←'3b↓βO#∂∪∃βSF)βCW⊗)↓βC∞;↔Mβ}04)↓α↓↓α2M~A9↓∧K9βπ'S'}q1↓β∞c1β'w3?∂π&K?;Mε{→↓β
βCπK&K∂W3∂⊃βOW↔≠gOS.i↓β←Nc1βOFK∀4R↓↓↓↓π##∃↓πβWK∃πβπ∨↔~↓βC↔∨+3'π∩βS=↓π##πQπ≠WOO≠S↔5r↓↓α∪.≠3πK∂#'?9ε{→↓β&S¬↓π#=β(h)↓↓α↓βC3∞≠↔⊃βNqβCW⊗)βCπ>+Mβ'~β∪↔O∨∪'↔"β'9β
β3πS/⊃βO↔∨#'?9ph(4(hP4*∪.≠↔7/⊃↓Y1β e]]α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓≠→5E9:qI↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓αε∨∃↓~i]D4P1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓∧kπ∂3O≠AαK.3↔K↔v≠∃α7∞sWπ1α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~"Q(4(hP4)↓α↓↓↓↓αα'9↓π##∃α$zBM5↓↓β'oβ3↔7.sSπSN{91β≡K∃↓εKMβS∞[↔9↓π≠=βSFQ↓β∞c1↓αdJNCMε;⊂4R↓↓↓↓π≠WOO≠S↔7~βOπ[.!β≠K}iα2&≥↓β←'faβO#∂∪∃βSF)βOπn)β#'>AβO↔>k↔;Qph(4)α↓↓↓↓α↓απ≠&+IβO/≠C↔;"β#πMπβK↔C∂∪↔⊃↓π##∃αdJNAβ≡{K∃7Nkπ∨∃ε3?Iβ'+7C'v91↓βO!βK↔'+K;LhQ↓↓↓αβ∂?;'∪?1β&yβS#*β?C↔⊗S';:βOgO&+5βOzβS#π"β'Qβ≡9β*β∪W7ε+⊃84Ph)↓↓α↓↓↓↓∧K→βO/≠C↔;"β'M↓ε;'[↔rβπ9β∂∪∨W7.sQ1β&CπQ↓εK∨Wn+;QβO→β↔cεc?∪↔~;↔⊃↓ε;⊃β&C∀4)α↓↓↓β⊗+OW3&K;≥β≡CπKπ∨#↔I↓π≠SK'v9β'MαβCπO≡+⊃β∞≠-↓β&yβS#*↓β?C/∪πS'v9βOg∨#↔5↓εMβ∧hQ↓↓↓αβ∂?7n;⊃9α↓"O↔*β∂3'v)βπ;"β[π3⊗+Q9%α↓"?9∧JRMβ&C'MβO→β∪?v)β←'&Aβ¬↓αrZε2,)m↓β}p4)↓α↓↓αNJ1βSFKMβ'~β∪?;*β←'SBβ¬αB$b>ε⊃r↓α?9¬">BMk AβSF)βπK?+7↔;"β'MβN;;?K.!9$4Ph)↓↓α↓↓↓↓¬##∃α≤
&1β6+KO'}qβWO/→βS#*↓βO↔≡{;⊃β∂∪∨W7.sQ1βN1βCK/≠↔;QbβπMβ
↓β≠'f)β;πn)84)α↓↓↓α&C∃β#N;!βO.;7↔;"β'Mβ'+7C↔"βW;∪/⊃βS#O→β;πn)9↓α&C∃β3␈9βO↔>k↔;Qπ≠#?Wf!βS#.qβ∀hQ↓↓↓αβOπ[.!β←'&A↓αN
2∃1βv{QαN≤
Z∃9α↓αS#O→β'Mπ+O↔⊃αβS=β∨∪↔πS*βOW∨KOS↔o→↓βSFQβ∂∞p4)↓α↓↓βOFK∃β&C∃βO∞k∃β#N;!βO.;7↔;"β∂?;&';'v9β∂?&)βOC.≠'≠'~βS=β&C∃βO.∪OgO&+584Ph)↓↓α↓↓↓↓∧≠?77}s3eβ}s∃β←Nc1β←⊗KS∃β
βO↔S/↓βK?/#';∃ε3?Iβ
βOW∨KOS↔jβ3'/*βS#'≠P4(4R↓↓↓↓αCCK?>p4)↓α↓↓↓↓α↓↓↓↓G#↔KC⊗I$4)α↓↓↓↓α↓↓↓↓αCCK'v→↓∨?π#'?;≠Q$4)α↓↓↓↓α↓↓↓↓αq99β⊗+π⊃βNqβ?C&K?;Mαq984R↓↓↓↓α↓↓↓↓α↓#S↔↔βK%$hQ↓↓↓α↓↓↓↓α↓↓#C⊗K;
↓>c?π∪Ns≥$4R↓↓↓↓α↓↓↓↓α↓999εc?π⊃εK9β≠Nc↔Mβ}1β≠Wv≠S'?w→↓99ph)↓↓α↓↓↓↓α↓↓↓#>→$4)α↓↓↓↓α↓↓↓↓αCOOS∂#WMβ>≠S'7*↓A$4R↓↓↓↓α↓↓↓↓α↓#OW∨β↔;⊃Hh)↓↓α↓↓↓↓α↓↓↓#∨#πKQo##∃7∨+Og∨#↔5$hQ↓↓↓α↓%$4Ph)↓↓α↓↓↓↓¬##∃β∨+Og∨#↔5∨~↓β↔;6KK?;n+;QβO→β;?:↓βK↔∞#eβ≠␈⊃↓β∪.kC';:q↓απg#↔K;∂#'[↔gI04)α↓↓↓β}s∃β7N;#Qβ?∪'S∃αC?9αM"M$4Ph)↓↓α↓↓#O/≠C↔;"↓∨qj∧"V6A∧"N-j4z>∩&∪YαRM∧rNV
≥JM<4R↓↓↓↓βQ∩ε2bα∩>:*!<4)α↓↓↓βbH4(4R↓↓↓↓π;#'∂Bβ←'3bβ∪=β&C∃β∪.kAβ''≠↔3→αβπ;⊃πβK';"β¬β7/≠Oπ∨*β←#↔rβ∪?;*q↓α?r↓αNεLaβ?;(h)↓↓α↓β7'>CQβ←⊗KS∀4Ph(4(hP4*C∞;∃↓Mk9I↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓≠→5E9:qI↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓α∪↔≡+7↔∩↓Y1↓I]\4P1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓αS#*αOgO&+5↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓)T"Jε~"Q(4(hP4(4R↓↓↓↓αCOWOε+;⊃↓?bNεZ*αNfMT2>=:≤
[p4R↓↓↓↓α↓↓↓↓α↓↓↓↓:B~>=¬~"Iα≥JM%$hP4)↓α↓↓αO.)βπ3≡yβS#*β[π3⊗+Qβ≠.s∂S'}q84(hP4)Es99M↓∧;π';Ns≥βπv!α/↔/β';≥∧≠?;S⊗{04(hP4)↓αα'9β&C∃α7.cS'∂~β'7Cf+7↔;&S'?raβ←#.qβ¬β≡[↔⊃ε+;['⊗{;7↔w!β'Mπ∪↔OS∂∪S↔⊃εKQβ3}{/L4Vc'/∃αβπ9↓ε+KK?∩↓βS#∂!βK↔'+K;MαβS=↓π#?A↓εc↔[↔bq↓αSF)↓β≠␈∪7M↓εK9↓β&C∃↓β/∪K3'∨!βπK(h+↔[∞cWπS.!9↓↓¬##↔O*↓β≠?⊗kM↓β≡C?W3"↓β∪=π;#πS/3↔I↓εKM↓βv+∂↔O≡Ke↓π#=↓β∨#πKQαβWAβ&C∀4+∨+Og∨#↔59ααS#∃αβπK∨.k↔;S~βS=↓π##∃β≡{77πv!↓β←FK∂!βNs[?/.!↓βSF)βOW↔≠gOS.i↓β7∂Iβ∀hS?S∞K;↔⊃π3'¬↓G≠SπS/→βπK:Iβ?IαCOSπ'+Mβ+≡a%84Ph)↓↓∧K9↓β&C∃↓α∧"A5Eα↓β'7εc↔7↔w#πS'}sM1↓π;#↔9αβ¬↓β≡[↔⊃αβ↔;[O∪?;7.sQ↓βO→↓βK/≠SπK&+⊂4+/C↔∂W&K?9β≡{;S'w+↔M↓ε3K?5π##∃↓πβ?';"β←#↔⊗)↓βO/≠C↔;"β←πMαβ∂π3f+⊃9↓¬##∃↓εs↔cQε3?K4hS↔[πg+πS↔"βO#?.c⊃↓β&yβ←#∂#↔[↔∩β'M↓εs↔∂↔∨≠πKeπ#=βO&KQ↓π+AβSF)βOW↔≠gOS.i9↓↓αB'QβO_4+πg≠=βC␈≠O'f)βS=ε≠πWO*βS#∃π≠π7∃π∪↔SW⊗qβS=π#?Aβf+[↔1ε{9βO&KSWαβπMβNqβS#*α7W3&K∂L4VK7C3.k↔;S∂#'?9αβe↓π+O';:β[π3⊗+Q↓βNsOS↔∞!↓β?2βOWOε+;⊃9J↓↓αSF)↓βπ⊗;W7↔w#M↓β}1βS#(h+∂?nkπ;⊃εc';∃π;#'∂Bβ';[}[↔⊃β&C∃βO.∪OgO&+5β7∂Iβ∃ε{SπNs↔⊃β6K¬↓#∨#πSWthe subsystem wants to hide the underlying Maclisp from the user, it has a
number of facilities available. By setting up its own user-interrupt handlers
it can handle any LISP errors which occur itself. In Newio implementations, it
can alter, augment, or abolish standard interrupt control characters. It can
replace the Maclisp interpretive interaction loop with its own by using (sstatus
toplevel) and (sstatus breaklevel). It can also provide a totally different
interaction loop by not returning control to the LISP top level when it is
started, but instead retaining control in its own functions which read and
respond to user input.
It is possible for a subsystem to retain the trappings of Maclisp but change
the way things read and print. Macro characters and the readtable can be used
to change the way input is parsed; alternatively, setq'ing the variable read
will redefine the system reader function (in the PDP-10 implementations). All
output by Maclisp (with the exception of character-string messages) is done
through the function prin1, and the subsystem may redefine this function. In
the Multics implementation one simply redefines it, but in the PDP-10
implementations the variable prin1 must be bound to the function which is to
substitute for prin1.
December 6, 1977 ∪3-1.7.2 Page 3-73
**DRAFT** Maclisp Reference Manual **DRAFT**
Some subsystems don't do any of this, but simply consist of standard Maclisp
augmented by some additional functions which may be used in forms typed in at
top level.
1.7.4 Purity
In the PDP-10 implementations, there are some facilities which allow
subsystems to put their non-changing data, function definitions, binary code,
etc. into pure pages. This decreases the load on memory by sharing pages
between multiple users of the same subsystem.
There are some extra storage spaces which are used to store pure (unchanging)
LISP objects. These are the pure list, pure fixnum, pure flonum, pure bignum,
and pure hunk spaces.
purcopy SUBR 1 arg
This function makes and returns a copy of its argument in pure storage.
This is primarily of use in the creation of large sharable systems like
MACSYMA. In implementations other than PDP-10 implementations with pure
spaces, purcopy simply returns its argument.
There are a number of features which control how binary code and
constants are purified when a compiled program is loaded into LISP.
bporg VARIABLE
The value of bporg should always be a fixnum, whose value is the address
of the first unused word of binary program space. This value generally
should not be altered by the user, but only examined. bporg is updated
whenever binary code is loaded by lap or fasload.
bpend VARIABLE
This variable should also always have a fixnum as its value; this
indicates the last available word of binary program space. This is updated
by many internal LISP routines, such as the garbage collector, the array
allocator, and lap and fasload.
Page 3-74 ∪3-1.7.3 December 6, 1977
**DRAFT** The System **DRAFT**
pagebporg SUBR no args
Causes the variable bporg to be adjusted upwards so as to lie on a page
boundary. This is principally useful on ITS in conjunction with the
function purify. pagebporg returns the new value of bporg.
getsp LSUBR 1 to 2 args
(getsp n flag) ensures that (- bpend bporg) is at least n, allocating
more memory if necessary. If flag is non-nil, then the memory added is
marked as being potentially purifiable by purify. If flag is omitted, the
value of pure is used. This is generally used by clever subsystems loaders
to expand binary program space quickly so that fasload will not require
several garbage collections to do the same thing. It can also be used by
programs which create and destroy many arrays. See also noret.
noret VARIABLE
Normally the garbage collector will return memory to the time-sharing
system if (- bpend bpOrg) is very large, but setting noret non-nil prevents
this. This is useful in conjunction with getsp.
purify SUBR 3 args
¬
The first two argumefts to purify should be fixnums, delimiting a Range
of memory within the LISP system. The third argumeft is a flag. If it Iq
nil, then the pages covered by the specified range od memory are made
impure, i.e. writable. If it is t, then the pages are made pure, i.e.
read-only and sharable. If it is bpore( then the pages are made pure, but
in addition some work is done to make sure that no UUO on those pages may
eveR be "clobbered". (See pure and puRclobrl) Dhis oPtion qhould always be
uSed iF the pages involved contain binary co@⊃JAY←¬IKHA rAYC@@A←d↓MCgY=CH\~(@@@@↓!eKg∃]iYr↓akeS→rAI←∃bA]←QQS]N↓S\Ai!JA)∨A&Zb`↓S[aY∃[KMi¬iS←\lAShA%bAS]QK]IK⊂~∀@@@Aae%[CeS1rAM←HAae←⊃kGS]≤AgsgQK[fA kSYhA←\A1∪' X↓gkGP↓CfA≠¬π'3≠∧XAS\AgkG AB~∀@@@A]CrAi!ChAaUeJ@AACOKf↓GC\A JAgQ¬eKH@↓EKio∃K\AkMKef\AqC5aYJTAiQJ↓M←YY=oS]N4∀@@@AMk]
iS←\↓[SOQPAEJAUgKHAQ↑Aae=IkGJ↓BAgQ¬eCEY∀AgsgQKZA←8A∪)&h~∀~∀4∀~∀~(~∃ K
K[EKH@lX@Drnn@@@@@@@@@@@@@@@@&LZb\n8h@@@@@@@@@@@@@@@@@@@@@A!¬OJ@f4nj~∀**DRAFT** Maclisp Reference Manual **DRAFT**
(defun superdump ()
(setq lopage (pagebporg)) ;save low page address
(setq pure 3) ;specifies pure code
(setq lopage (+ lopage 6000)) ;allow for area 1
; (ITS page = 2000 words)
(fasload funny fasl) ;load up system
(fasload weird fasl)
(uread some lap)
...
(sstatus toplevel ;set up top level for system
'(top-handler))
(setq hipage (pagebporg)) ;save high page address
(purify lopage (1- hipage) 'bporg) ;purify pages
(suspend '|:pdump sys:ts super↑M|) ;tell ddt to dump
(terpri) ;stuff for system startup
(princ 'welcome/ to/ supersystem/!)
(terpri))
pure VARIABLE
This variable, initially nil, should be made non-nil by the user before
loading binary code which is to be made pure. It signals lap and fasload
to be circumspect about any UUO's in the code, because pure UUO's cannot be
clobbered to be PUSHJ's or JRST's. lap solves this problem by clobbering
the UUO immediately if the referenced function is already defined and is
itself a subr rather than an expr; otherwise the UUO is made permanently
unclobberable (i.e. CALL is converted to CALLF, etc.).
fasload is somewhat more clever: it too tries to clobber each UUO
immediately, but if it can't it puts the address of the UUO on a list
called purclobrl, which is checked at the end of each call to fasload, and
each UUO on the list is clobbered at that time, if the appropriate function
had been loaded by that call to fasload. If the function never does get
defined, then purify will also check purclobrl and convert each UUO to its
permanently unclobberable form.
If pure has a fixnum as its value, then fasload (but not lap) behaves
somewhat differently. pure should be the desired size in words of the
"uuolinks area"; this is rounded up to a whole number of pages. (If pure
is between 1 and 8, it is the number of pages rather than the number of
Page 3-76 ∪3-1.7.4 December 6, 1977
**DRAFT** The System **DRAFT
*
words.) Let the number of pages be n∞ First fasload callpε@Aa¬OKEa=eNXA¬]H~∀@@@AQQK\AIKgKeYKf@e8AaCO∃bA←LAEC]¬erAaI←OeC4AgaC
JXAk9YKgf↓BAae∃mS←kL@AGC1XAi↑4∀@@@AMCg1←CHA!CfAC1aKCIdAeKg∃amKH↓iQKZQR]J8AiQKdACeJ↓eKgKβ∪[↔⊃ε{;3e∧{;∂∃Jq↓αSG+L4)α↓↓↓β6O3?∞!β#π~βSO=π≠↔SMε{⊂∩εd∞ε∞≡↑4απ&t
v␈⊗4∞vO&π4π>
∞=ε∞fD6∞fD
FF*∧fO↔>Dπ∞/AQ"αα∧∧αε∂,\∩β
$λ⊗v"∞Mε*π<X6}vD∞6/"∧∧&∂⊗\∀β∩∩d∧∧v←t
vF.lZf/∩l↔≡f|≤BεF≡4π&@hλ≠
|9λ_!QHλλ∧∧_{∪l,Y<X,-→(∃*Ykλ∩.D→≠y.P77zλ860qYP4z⊂~w⊂:4→P1wr→P12t[3P67Xp2rελ⊂1:`4 rather
hashes it @¬]HAa1CGKf↓Sh@A%\ACe∃B@bA%HAShAoCf↓]←hAQQKeJ↓CYeK¬IrvA∧@AG←ArASf4∀@@@AaYC
KHAS8AiQJAgC[∀AeKY¬iSmJ↓a←gSQS←\A%\@ACIKB@dαq↓αSF+9βπr↓αb∞"β';O'∪W∂SN{84)α↓↓↓βε{';SNs≥βSz↓βS#*αVV=αβ'9β∂∪↔¬↓β β'Mπβ3π∂.!↓β'rβS#∃αβ';∂∪eβ∂}#∃9↓αα←#↔rβπ30hQ↓↓↓αβ3/π&K;≥βFMβ.+9β∪}s∃1β∂∪↔¬↓⊂β7πeε∪∃βC/∪'≠'.!1β-!βπK. ↓Eβneβ;␈!84(hQ↓↓↓α↓↓↓αv{]β←F+9↓β↔+;;'v9βS#*β∂?∪*a↓βSF)αVVz;M↓βε{';S.!βS=ε∪e↓β&C∃αb≥!∨M↓εkπeβ⊗(4)↓α↓↓β∂f{↔⊗+⊃↓#&C∃αB%↓5EA∧b&NA¬*V=↓εCπ;∪f+Aβ'~β∂3↔6+Iβπ⊗{WQαD~Q%1αβCK?6K∪↔⊃bβ?_4R↓↓↓↓ε≠?WK≤)1βSFQβSF)β[πg+∃↓β}1β;?/+=β'~β;'1bβπ;⊃αβS#∃ε≠?∪∃π;'31π∪W9↓ε3πOS/⊃βS#(h)↓↓α↓βO↔≡{;⊃β&K7∃β∂∪?W; ↓β↔≡WO∃π##∃αD~Q∨Mπ;'31αβC?'w!βS=¬αVN"R;M9↓αα#/←/3↔I1εK_4)α↓↓↓↓G≠OSπ'+M↓β/+?3'v[M%βO→↓β∂∞c3↔⊃bβS#↔r↓βπK. ↓I↓εKMβ∂␈β'↔⊃αβπ∂Zβ';Sz↓βπK. ↓E0hQ↓↓↓αβ↔≠≠.≠S'[.ceβWv≠3?⊗+K';:βπ31π##∃↓¬*V=∨~q↓αSFKMβπfc?←Mπ##∃↓ε≠π33.!β≠Wv≠S'?w_4)↓α↓↓βSzβ∃β'∪π∂↔"βπ∨πNq1β≠␈⊃β↔c∞kC3∃bβ?Iβ⊗+∪↔≠Ns↔⊃β∂→β↔cπ⊃β∂?&)9↓↓∧sπSW⊗33ebβπ84R↓↓↓↓εK↔¬εcπK∨*↓β↔;␈+∨!β&y↓β∂}sSπ'rβπ31αβS#∃¬*V=∨~↓βO#␈+3⊃β⊗)↓βK/≠↔K[.!m↓#∨#πSW_h)↓↓α↓βWW}c';/~I↓#Ew19%βNK↔3∪~β';≠␈∪7πSN{9βK.c↔[πw!βS=π##'Mr↓απMε βKWf)↓β?2βS#Wn⊃04)α↓↓↓β&C∃βπ⊗+¬β#≡{W3⊃ε∪∃↓↓∪↓∃β3∂∪∨↔Iπ##π9π##∃↓εsW7/⊃β?→ε3W;∂&K?;Mε≠π33.!↓βJβS#∀hQ↓↓↓αβ3?π&+⊃↓β≡{∪∃↓FK;∂3.#';≥αα2&Nα↓β≠Wv≠S'?w→βOW≡A↓βπ~β↔GW∞a%9↓αα≠?IαβS#∃∧"⊗
54)↓α↓↓β[/∪O'?raβCW⊗)β7πJ↓β∃π≠↔Qβ&y↓β¬εs↔∨π&K[∃β63W∃r↓↓βSF)β7π>s'SW&)β'MαβWO↔"βπL4R↓↓↓↓ε?[*aβ←#Nc∃βSF)βO'>qβ∂?w#K?3~↓β←#N≠!βO.;7↔;"βS=βf{π⊃βNsS=↓Gβ?O'&K[∃↓βiβ3?8h)↓↓α↓βO↔>k↔;S~aβ;↔>S'[*↓uβ#N;!βO.;7↔;"I9↓α
β;↔∨∂#'[∃π3π3W*βπ3Oz↓β∂π/≠↔Mβ/+?3'v[L4)α↓↓↓β∂∪↔¬↓
↓βS=ε;=↓βNqβS#*β3?]αβO↔∨n+;Q1ε;⊃↓εK↔¬β⊃β'9αβS#∃εC'∨!αβO↔∨n+;Q9αα≠?HhQ↓↓↓αβ∂?7εS'Nc'Sebβ¬β;.;πS'6)β[πg+∃β7.;M↓π##∃β≡7∃β∂→β¬βε{O'SO3∃β[∞cW∃↓π#=βSF(4)↓α↓↓α&%→β'7εc↔7↔w#πS'}q84(hP4+C/∪∂3?↔∪1↓↓α↓↓↓↓α↓↓αZ
∩&ε
d(4(4R↓↓↓↓α↓↓αW≡+⊃βJ↓β≠π≡c?π⊃π#=β/.+A↓β'∪π∂-ε{→αV,y∨M↓π;#'∂BβπK∃πβ?S↔w#'π3gI↓β/!β;? h)↓↓α↓β'7n+∪'π&+3eβ≡c?/∪π3*p4(4Ph)+C/∪∃↓↓α↓↓↓↓α↓↓↓↓α↓αZε∀Jε
2(h(4)α↓↓↓↓α↓αS#O→↓β[∂∪'πf)↓β∂}sSK?g→↓βπ/#?7π&K
↓βπ+K'≠N≠πS'}q↓β?2↓αM7/CCK↔∨≠'?;~βπ;⊂hQ↓↓↓αβπS?nK
βONk?3~q↓α'2β'QβO→βO↔"β;?9ns'1↓G##∃βNs'S'∞aβ[πg+∃β'~β;'1Ja↓βSF+9βSF(4)↓α↓↓β≠}c3?←Ns≥↓β∂∪∃βCf∂↔⊃αβ'9βπ+K∃↓π≠S?K∞;∃βOε∂↔Mαβ';O&+π⊃β}1↓βK.;W3π∩βOS?⊗∨∀4R↓↓↓↓π≠Cπ∂/→i↓βεsπ7↔~β?→β∂#?7'~↓βOgn∪?3MZβ3'O"aβ≠'FsW51ε33?;.i1βN;;W5b↓βπ;"β#W;Xh(4(hR∪↔∂.k↔Iβ11↓EK9]↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓MMk 9]9"↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓αCπ>)↓M5;84(**DRAFT** Maclisp Reference Manual **DRAFT**
constants used by code loaded with fasload; properties whose indicators are
in the list which is the value of the variable putprop (initially subr,
fsubr, and lsubr). In the SAIL implementation, if *pure is a fixnum, it
should be an estimate of the total number of pure data structures needed,
including all files previously loaded and the initial LISP system pure data
structures (currently about 6000. words). This causes purcopy to use the
high segment for pure data. Making the estimate in *pure too large merely
wastes space in the high segment; making it too small causes purcopy to
make copies in the low segment when it runs out of room in the high
segment. This whole feature only works if pure iS a negative fixnum.
putprop VARIABLE
If the value of *pure is non-nil And the third argument to the putprop
function is in the list od indicators which is the value of the variable
putprop, then the second argumeft is passed through purcopy to purify the
structure. Furthermore, the two celhs od the property list are cons'ed
from pure list space* Since impure ceLls must precede pure cells in the
property lisT, putprop may ngtput a new property at the fp¬W]hAWLAQQJ
∀@@@AAeWaKIirAY%chAS8AiQSβ→β∂π≤)0$(hQ↓↓↓α↓↓↓α&C∃βC-#CK∨α↓βπ≠ ∧πε.↑
&␈αjVv∨M→vw~∧ 6v␈tλ⊗⊗␈↑@ππ∂-_fN.D∧ππ⊗|∧⊂∩\8∧q @1Sgif8~∀@@@AβL↓]KGKMcCeR0@AiQ∃rAoS1X@AGα{Ceβ&C∃↓β¬∪?C↔↔#eβ3M≠Q↓↓F∪WQβv{Q↓β&C∃βC⊗{C↔K&K↔L4R↓↓↓↓∧εFF.↑8VgY<j$
9]≠d
Xπw-ppeJ↓ci←E¬K@∃β≤¬rπε≡BεODλλl≥H_Y$
αp∂did¬SKHαq↓αSFK@~ε≤4π'↔\QPBα∧∧απ⊗\|↔ε&LZ7
ε|dπ&FT
f∞g\Tε}∩∧¬'π<Y+D∧∀Y0l≥≠λ⊂-N{h⊂~~0z⊂ $e`
ae=`AC]⊂@AIK→k\AkMJ~)α↓↓↓β∧εW'π-x¬@∧¬∀~(~∀4Ph ⊂@ ¬εEβE
λ∧⊂∀!Q hPβ"C!∧¬∀~(~∃!C≥J@fZβ9a↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓≠→5E9αqc"α∧∧ααα∧∧ααα∧∧ααα∧∧α∧→8p∩[q2y 4∧X@BβIP≠_Q bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α¬&T¬∨O>LVjα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hS∃gαα∧]≡6≡.ML⊗v.}↑2∧7]l7&N⎇n0hPQ!PPh&∃cBs∀∧¬&FT
7&∂N↑2∧7]l7&N⎇n0hPQ!PW∨L≡G/~∧∧ααα∧∧ααα∧∧α∧5:X%⊂h!Q"αα∧∧ααα
Mε*α∞>F∂'↑4π∨ε\=⊗∞b∧f␈⊗T
↔~α∞↑6."∞Mrαε|↑Bπ&Tαπ6≥NV*ε|dαπ6≡-⊗␈/4∞7O∨L]PhR∧∧ααπ≡&∞n↑LW↔~d∧α∧ON4αε6≡.7"α≡&?.\]g"b∧
f␈"∧W6∞N\↔&.EDαεO4∧ε∞r∧↔&}]≤2π∨≥\&}`Q$ααα∧
⊗v&≤<↔&Nltπ>F≤=αε}d
↔'~
\⊗wJ∧g.v>M⊗}w4∞7&∂N↑2π≡
}Vf"∞W⊗6}-Rrα
Mε*α∞↑6*ε|aPRα∧∧αε∞LM↔&N⎇l⊗bα≡&?.\]g'~∧F/ε]lG~α
⎇bαπ⎇↔"α∞Mε*αm↔↔∨D∧ε∂⊗}]V.wD∧εO~d∧α¬&↑6(h$∧ααα≡&?.\]g'~
\↔Jε}$εn∂∀
f␈",Rε/l≥G.∂L\BbεL↑ε.vM≥f:ε⎇dπ&FTfO↔>Dε∂⊗}]V.wEdα∧NaQ"αα∧∧ε≡/.L⊗Nr∧⊗&&≡M⊗}v≥Dε∂⊗}]V.wN4αε∂,Tε}n≡NF."D∧ε
εL\f∂.NDαπ6≥NV*α
≡2π∨↑∞εfN\E@hR∧∧ααε≤|⊗Nr∧F/ε]lFNvt∧ε}r∧∞vF∂D∧π&FT∧ε6O.>Bαε≡,w.n]nBαε≡5bαα
Mε*α∞l↔⊗N}↑2π∨L≡G/_Q$ααα∧g.v>M⊗}w4↔⊗*
M↔∨&\Dε⊗.M}rph!Q'∨∨L≡G/~∧∧ααα∧∧ααα∧∧∧5≥X* hPQ$ααα∧∧αα¬MRπ∨>L↔'/4∧π∨ε\=⊗∞bmw⊗j∧
↔~π↑<V"πMtαπ≡↑Dπ&FT∧π6∞N\Rε}d∧π6∂-≥w/~∞?↔∨&]QPRα∧∧απε≡,⊗n/L↑'~r∧ ↔'~≡&?.\]g'~≡&*π=≥VNf≡$π&z∞Mε␈≡T
v"π>L↔'/5aPPh*Mε/≡T↔⊗*∞Mε*πM
⊗v?4∞FF∂D∂⊗␈*<⊗rεMtπ>OM∧π∨&≡NW~ε≥lBπ∨>L↔'/7!PPh*:D
%Z4∧5,h:DL|j4∧4⎇$ ∩|xQ!PW&≤.6OVT∧ααG>L↔'/4∧π&∞.=↔V*∀∞&/'↑-g~α∞Mε*εn]V⊗/$∧ε}2=ε∂⊗≤>F/∩∧∞ε␈≡≡M⊗}w4↔∨∨]\V h$∧ααα∧∧ααα,W'>\]bαπL≤"π∨M}π~b∧∞vFN=∧ε&/]f'~∧
vrπMRαε≥↑εf.\]g&∂M≥vrr∧λ7/↔,]g&g⊃Q"αα∧∧ααα∧∧π&F≡4αεO4∧βBα
≥bαπMR¬∧J¬Sα∧
⊗oεL]V.wL≡FN}d∧ε∞vD∧βαd∧εNr∧∞FF* ↑Vg&≤>0hR∧∧ααα∧∧ααε≥↑εf.\]g&∂M≥vrpQ!PVv↑⎇FNvT∧ααG>L↔'/4
f/>M≥f*J∧∞&/'↑-g~ε∀∧ε6O
nVjπ⎇
⊗≡B∧
↔~πMRαε≡<6NJ=v&*∧f␈∩∞Mε(h$∧ααα∧∧ααα=ε∂⊗≤>F/∩∞⎇εN≡∧
V∂⊗>4απ&Tε.vD
v2ε∀∧εfNlTε}2
≥gπ/Edα∧6}$αε/≥WεfUDε}vQQ"αα∧∧ααα∧∧εnN⎇∞Bπ≡∨∀αCj¬∞6/'∀6Bα∞O⊗JJ∀¬π∨&≡NW~εl↑vfNlU∩Jαdλ7/⊗\]g&g∀∞FFO4∧εO~ε⊗PhR∧∧ααα∧∧ααα
|7&∞E∀εNr∧∞FF*
λEαk⊗∧αεN↑
F.n]nF∂&≥⎇bε∞lDβ∩∧¬ε}∨L≥BJε≥dαπ&T∧o.NM⊗∨_Q$ααα∧∧ααα∧
⊗oεL]V.wL≡FN}eaPPh,=ε∂⊗]|F*α¬∞7&∂N↑2ε≡≡&n}LTε2J∞,W'/-n2π&Tπ6∞N\Rε}d∞FF*=ε∂⊗≤>F/∩]]v&*∞>vO&=∧ε6␈!Q"αα∧∧ααα∧∧π&FTfNfTbrα ≤bε2
≡2π"
}"ε}]≡G&.D∞FF*∞l⊗g.T
v2πO≥rαGMRε&\l↔.gD
w/'∞↑@hR∧∧ααα∧∧ααπL↑&nNl≥BJε≡4ε∂∨>]V."d∧∧N2∧∞FF*=ε∂⊗≤>F/∩]]v&*∞>vO&=∧εO~∞DααGMRεv}-V∞`Q$ααα∧∧ααα∧6∂≡Tf␈∩∞Mε*πL↑&nNl≥BJε}↑Gπ/D
↔~α∞<Vw"∞Mrπ&Tε&/m≤6*ε≡4π≡}⎇dε∂~∧
↔"ε≡1PPh!Q$&.<]V⊗/$εbbβ↔⊗s:α∧∧ααα∧∧ααα∧∧ααα∧∧αα↓65S
s∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α¬ε≤|Rβ~Vw⊂hPbR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧ V∞≡M≡7α¬,\f/⊗]l6*∧\≥g.∞D∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hR∧∧ααα∧∧ααε|]f/⊗≡LV"r∧ ⊗2πMRπ∨⎇≡F≡B
≡2εv≥DαG&Tεv␈-\⊗bε<≡6*εm}"ε6≥LW~ε}Mε/∩∞Mε∞pQ$ααα∧∧ααα∧∞FF*∧∞F/⊗]≥f∞b∀
w/'∞↑Bαε≡4αεF]LBπ.nM⊗bα∀αεv↑⎇FNvT
↔~α∞O↔ε.EDαε∞dW↔⊗}!PRα∧∧ααα∧∧αε}<>W↔~D∧εNw∞↑BεO4∧π⊗/≡\W∨&\EBαε}$π&FT∧ε↔.llW∩ε,\6}n↑4αε7]MBrα∧¬∧Nr∞Mε(h$∧ααα∧∧ααα ↑Vg&≤>2εN↑
F.n]nF∂&≥⎇bbπ≥}Rαε<≥bε∞N=rε≡≡↑6*πMRαε.\f6/$∞Fzε,Tαπ≡]nBε↔⊃Q"αα∧∧ααα∧∧π/≡≥lrπ&Tε6␈,<Rn␈↑Nπ/"∧g.v>M⊗}re∀¬&F≡4ππ⊗}m⊗&/4∧εNv>,V∂≡\Dε.6m≤6N.l?⊂hR∧∧ααα∧∧ααε≡Dπ&FT6␈∨D
v2εm}BεN]\V&N≡LVgJ∞<V.Nltε∞fD
w/'∞↑BεNd∞6}nT6∂≡↑5`hPQ$ααα∧∧ααα∧¬π∨∨L≡G/~=ε∂⊗]|F*π∧bJπ<↑G~πMRε≡≡&∞∨L↑"nn|LRπ∨⎇≡F≡B
|bπ&Tε6NLTε2αaPRα∧∧ααα∧∧αεn∨∀αε⊗T∧π"α
}"ε}]≡G&.D∧π&z∧∞6N>m≤gJα∞Mε*ε}↑Gπ/D∧π&/-]⊗v∞D∧εNr∧∞FF*∞O⊗xh$∧ααα∧∧ααα∞l↔⊗N≤-F*J∧∞Fzπ¬Dαπ>
≤6Bα
\↔Jε,Tαεv≥Dε␈∩∧∞Brα∧∂αε∞lDαε2∧↔⊗*↑f∞g\≡F."aQ"αα∧∧ααα∧∧∧∨/.,Vw&O∀εNr∞Mε*¬λJαk∧
⊗oεL]V.wL≡FN}d∧εO"
≡2εv}Dπε␈>=⊗⊗fT∞Fzα∞<W"πMPhR∧∧ααα∧∧ααε=↔⊗∞>LW∩n]|F*π>⎇↔&≡π4αε}lTεo/>Dαπ∨\6N7∀
↔"α
≥fO&≤≥FgJ∞Mrαε}Vrr∧
6.(Q$ααα∧∧ααα∧⊗g≡t¬π∨&≡NW~εM≥fn}LU∩ε∞lDαG∨L≡G/~m⊗f.tus linmo@⊃JRAe∃CAf@↓iQJ@ YS]J↓[←IJλ@AC]⊂@QggQCikf↓YSM[=IJ@A`RAgKQb~∀@@@@@@@Ai!J@EY%]J@A5←IJD↓iV@A`@QhA=`@A]%X\RAQQKgJAMk]
iS←]LAaCW∀@AC\↓←aiS=]CH~(@@@@@@@@↓Kqie∧ACeOU[K@;"aβ←#L≠!β'~βS#∃∧3'3∃¬;#?O*β3'≠*β7?∪*β'M↓ε∪↔'≠8∧ε&O<8
.yrr.
ThipεAIK→CkIiLAi↑@↓iQJAYCYkJ↓←DAieR@@QQQJAI∃ICkYβ!β';π+Q↓β&+K .≥l⊗bJd∧∧NpQ$ααα∧∧ααα∧⊗wJ8λ.≤+λ∃
<h⊃M≥→(∪.↑⎇λλ,(_ ⊂≥2y6t[0p.A∪LAM←[J@↓S[aYα+7.β]_.M;{\d∞~→#!$λλλ∧∧λλλ∧∧[~;LT≠;p∩→Q⊂6p↑P77jλ12P!Z0s3rY↔⊂⊂⊂∩pε the "lIne mode" IpεAhXAkgKHAS]aUh~)α↓↓↓↓α↓↓↓βO→βW4∧f/⊗\@π/α⊂εfNlTε∂"⊂π&N\Tε⊗.mz&*ε,Y⊗v:∞8Vw"∞Mr∧d~:αrα
Mε*ε≥nπ/"QQ"αα∧∧ααα∧∧ε.&≡M⊗v:=vw6]nFN}n4αε}d∞FF*∧
ε␈∨D wε/,≡FNvt∞7O∨L]Rαε≡,Rπ/<XBrα∧ ⊗2πMPhR∧∧ααα∧∧ααα-M⊗v*∧
V}&T$εO~∧
fNbD DM≥∧∧π∞.↑4αε.≤=αε≡≡&∞∨LZ"αε≡4εO"∧
↔4λ≥≡.9λ_-lβ"H∧∧λλλ∧∧λλ_.∞≠~9.∀λ~=∞4≠⎇{D∧~;\∞↑λ→1
≡~;Yd∧_{sNl;]~-⎇\kH∧
~~<d∧≠;yTλ_x-d≤≤[nm9→#!$λλλ∧∧λλλ∧
;\≥.D→X8m≥~=~,↑h≠;n,(≤⎇-≡→9∧∞≠h∪ ~tλ_-lλ≤≠n≡z8[∂∀_Y=∞L<Hλ
;Y≠
≥Yh≠la"Hλ∧∧λλλ∧∧λ≥~T≥→<M];X;¬Dλ~9D
=λ∩.4λ_(∞O<→(∧∞~_=∧ ∩4t∧
{[⎇n4λ_(↑Y8=∧∧→→8-D_8[n↑C"D∧λλλ∧∧λλλ
⎇y=L↑Kλ~.D≥<y.∀λ≠;n,(≠8,=~;Y$∞Y<{n↑Xy<edλ∩=∧∧~<h∞
||z,-→(→M}Hλ_$∞<y<AQHλλ∧∧λλλ∧∧≤≤[l}X;(∞Mh≥_-<(→~.,8⎇λ={]≤M⎇λ≠yD∞~→(∞L<[:-l;λ≥m;H≥
(λ[
≥Y(≠-|→(H
≡c"B$∧≠Z;π4~≠⎇l↑Y<K∧∞~~<d
8>(∞,<=2.,(~{M}{→9|(≠yD∞~→(¬∞|⎇_.N<h≥∞O*+H∧
~→#!!(λ∪.]≥~8n4~;<
L;9;NL=~;md_;≥l∨<h≠n<X=↑h≥z.Mλ_(∧-~;Y$
;y→$$≠yH∞EHλ∀l\#"B$∧_;≤mt≥~→$¬≤|⎇≡≥<h∞N≡<xl≥J(→N]X⎇~-⎇H_Y-M⎇kH ≥H≥~T∀p2)D~;<
L;9;NL=~;meβ"B$∧≥~→$→9X.]≥λ≤l↑≥~;Lt~<h¬∞|⎇_.N<h≠
≥[;yT≥
+AQC"JE%JJTh→3⊃*E%JJC!!"]≥∂≥;]λ∧∧λ
≤n>_=≥.4≥≥≡-≥]λ_m<Hλn;Xhm;→*$∞≥<[N4λ≠{D(≥≥∂∀λ~;NL<\].∞λ_z≡X8⎇↑KC"D∧λλλ∧∧λλλ
⎇→;H∧∞~→(=_<X,>→<H∧z_<D
<hλ∞O<→9∧
{Hλ∞M→(~-n≥=λ∧∞≥≡(m;→+∧∧≥~→$ ∩4t↓QHλλ∧∧λλλ∧∧≤≤[l}X;(∞⎇;≠λ,(~;NL<\].∞→9λ≥Yλλ∞M→(→N]X⎇~-⎇H→]-lh≥z-Mλ_Y$∧_<≤
M99λ∞Mc"H∧∧λλλ∧∧λλ≥∞⎇h_<L};9;NNh(m;→(≥Yλ_m<KH∧∧∩9Hm;→(
≡h≠{-≡≥→9¬D≥~→$∞X;≥,Tλ≠yD∞≡:#!$λλλ∧∧λλλ∧¬≥~→$∧→→9L≡;≥λ∧
;\≥.D→Z;U(λ~.4λ_<n>;99¬dλλ∃
(_z≡Hλ≠,∨(λ_LTλ→:.M→<H⊃"Hλ∧∧λλλ∧∧λ_z≡X8⎇↑H≠xM,8⎇λ∧
|H_$∧→Z>
n;(
≡xz:$∧_{yU+Hλλ≥↑(λ
|H≥~Tλ,G¬H_<l=:#"D∧λλλ∧∧λλλ=_<X,>→<\d
8>(,(≥<l\Hλ
M→(→N]Xh≠,∨(_Y$:=~↑H_;D
|Y~-l<↑(n;X⎇
≥{X;↓QHλλ∧∧λλλ∧∧→[|MTλ≠|D(λ→M∨≠];%Dλ≥z
≤zλ≠,\;\h∧∞~→(∧→9X.]≥λ≤o≡⎇→;$∧_8⎇
≥{Hλm|H≥
#"H∧∧λλλ∧∧λλ_m<X8nL<H≥m≡~λ≥
=λ_.<z:(∞l;≥9%dλ⊃[n$~;\nL;Xy$(→]-lh≠yDεhλ≠,\;\h∞≡:=β!$λλλ∧∧λλλ∧X8zd∞≠h≥
(≥≠n∧≠→=L]λ≠yD∧∪∩4j∧
_{mn≤[{¬Xj+H∧ 9H→N]Xh~.4≠Z;¬Dλ≥~T_z_.!"Hλ∧∧λλλ∧∧λ~<d
89→$
[{K-≥]→<N.<≥~-lkHλλ≥≠λ≥
∞Y9(≡Y⎇;,]]≤h≡Y(→.l;≥8.L9C!!"T_,|(k'ελλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∧f5,+N¬f(λλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧⊃→8l]8Y<DεKλ'⊗mc"@↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧
~→(
?<⎇→-Tλλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧
JQ
(1U
E!"C"AQHλλ∧∧λλλ∧∧∩;H∞M→(∩*Jh~;.
→;9-n_=~-⎇Kλ~.D≠8>$Y(≠L\y<|l≡↑(≥
t≥<y$¬≤|⎇≡≥<h∞N≡*(∞Mc"H∧∧λλλ∧∧λλ~-l[|[$ 5∀h≤[⎇=∧
[{K.>_;Y≡Yλ~-n→<\N↑≥λ_m<X8nL<\kAQC"H∧∧λλλ∧∧λλ∩-d∀⊃∀¬V,λλ
≥<≠→-\;]_.M;{\d∞z~8m∧≤⎇<∞
|]λ∧Z>≠N](≥≥∂∀~;\∞↑λλ≠-|→(
]|Y#!$λλλ∧∧λλλ∧∞~_;Dε,NDz_<L≤⎇→<N5+λ≥
;H≥m;H_-d~;]↑\]<∞D≠xxn↑\h≥
(λ_m<X8nL<H~.1"Hλ∧∧λλλ∧∧λ→[mL→9λ∧≠⎇{D∧≥≠h∧εhλ_M≡≤hλ,9[|LTλ≤y-L8⎇~-lhλ_-dλ~;NL<\].∞λλ→N]X⎇~-⎇KC"D∧λλλ∧∧λλλ
⎇y=L↑Kλ≥
(≥;Lm{→→,Dλ_z≡X8⎇↑H~<d∞_<|l\λλ_.4≥~→$∞y8{mlλλ_.,⎇;9-nλ≥≠aQHλλ∧∧λλλ∧∧≥~→$
;]→..]<≥∧];XnM;{K∧∞{hλ∞M_=λ∞M→(→N]X⎇~-⎇H_x-d→Z;∞L<Hλ
}=λ≥-nx;]\β"H∧∧λλλ∧∧λλ_m<X8nL<\kD∧∩9H∀→Z>
n;(~.4≥<y,D→[|D∞~→(n;X⎇
≥{Kλ∞M→;H∞M→(→M∨≠];$
8>#!$λλλ∧∧λλλ∧∞|→8m≤↑(≤L↑=:<L\λ≠|D[|XM≤→→;D∞⎇<≤L∃8<xm≥(_Z.Nh_<d[{≠
}|nH∧9→~-lh_Z.A"Hλ∧∧λλλ∧∧λ≠H∞Mh≥~T→Z>
n;(≤L↑=:<L↑h≥~Tλ_Z.Eλ_;LD_9→
≥Yh
Nzλ≠Dε.J$∧→[|L-9≤h
≡C"D∧λλλ∧∧λλλλm|H→/;<≠Uλ~;D∧≥~→$ 5∀h
≥<≠→-\;]_.M;{H∧∞<z;Lt
εεLεt
≠xnL;
(∧<h_!QHλλ∧∧λλλ∧∧→];L>~;{D∧_;≠
}|hλλ9sU∀Iy1h∧∞≠hλ∞<Y[n-(λ_$∧≤=:.Eλλ_N↑λλ≠M}λλ≥
(λ\
∀C"H∧∧λλλ∧∧λλ_m<X8nL<H∪ldλ⊂sij∀Ss¬Y11⊂%Xkλ∀m≥Xy(ε&λλ∞,<=2.,<h≥
(⊂sij∀Ss∧∧_Z=∧;Yβ!$λλλ∧∧λλλ∧εεε∧[|XM≤≤h≥
(∪1*H(_Z.EC"C!$λλλ∧∧λλλ∧λ>_;.
→.H∧(λ≤nL;Y_.,λλ≤n\\}<nL;(_m⎇]Y3NM;{H∧
<hλ∞Mhλ≥.<(λ↔Kd
_smn≤[{¬Q"Hλ∧∧λλλ∧∧λλλ∧∧λ≥<≡\[⎇eDλ_<l=:(λεεmJ(∧<h_$∧≤=:.Dλ_z≡X8⎇↑Hλ≥m
8zλ∧∞Y<⎇≡]≤h∞M→#"D∧λλλ∧∧λλλ∧∧λλλ∞>8\}.>→;+AQC"H∧∧λλλ∧∧λλλ∧∧
≤|nL=≥<d∞≥≡:-nλmAQHλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ
n;X⎇
≥{H
L;8Y∀
→H5#"H∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ
∞>⎇_=∞↑h≥≠n
→=Y-D j≤L↑⎇_<NE<⎇8N?<⎇→-U*#"D∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ¬≠h≠M≥λ
}H
∂$¬≠~<nL;H→E∀
#!$λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ
πT
≥≡-∀→J(ε6J**%⊃"Hλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ
↔Lu***!QHλλ∧∧λλλ∧∧λλλ¬→9U-d≤Y<nL<].>8\}.>→;(¬¬#"H∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ
∞<=≤(↑\[~.>λ≠Z-E#"H∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλ
∞>⎇_=∞↑h≥≠n
→=Y-D≠Z;¬⊃"Hλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ
≠M⎇;]→..]<≥∧
Z;
!QHλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧
~;M≡~8;
∨Y+=
+={n-→
#!$λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧¬→;]↑K<⎇,.}<⎇]**#!!"Hλ∧∧λλλ∧∧λ
≤nL=≥<d∞≥≡:-nλ_z≡H→Z-L*(≤L↑≥<[N4→];L5λ≥~T~;]↑\]<∞D→];L>~;{D[|H∞M→#"D∧λλλ∧∧λλλ=_<X,>→<H=_<H
⎇H≥~T≥≥≡$Z;→%dλ→Z-L(≠8/∀_Y(
⎇:=≥\Hλ ≡λλ→\X=;∞Nh≥≠aQHλλ∧∧λλλ∧∧≥C!!"]≥∂≤{{\d∧λ
≤n>_=≥.4≥≥≡,={\h∞N≡,(∞N≡,J$Z;Y∞4λ≥≥mt≥≥≡$Z;→.4~;]
t_(λ={\{mL+Hλ ⎇Y#"D∧λλλ∧∧λλλ∞=≠⎇;D_Y(≥H~;N∞=λ≥∞O(_;LDλ≥~T≠⎇~↑H_;D
⎇=≤∞↑λ≥≥∂∃Hλ∩,d≥≥≡&∀λ≠|D∞≥≡,AQHλλ∧∧λλλ∧∧~<h∞Eλλ~.D≥z;
D_Y(∧∞_:y-d_<h∞M→(λ≡≤≤[n∞Z8=T→~<L\⎇~;md≠yH∧∞~→(L9X=-Nβ"H∧∧λλλ∧∧λλ≥↑[:;L≥λ
→↑→<[-≥Y9λ/(≥~T≥X<M≤8[→.4≥≡:$;Yλ∞O;j+D∧∃~→$∧_Z;LM;Yh
≥]≠c!$λλλ∧∧λλλ∧(_{mn{{→$∧~<h,<z8l≥≠≡(∧∞<y9∧[|H∞∞<\≠n<<hλ
|H→8m
z;Yedλλ∩-d_9→
≡~;{EA"C"AQQ→8l]8Y<DεKλ'⊗mhλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ∧leV+NF∀λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λλλ∧∧λ∀_,|(k'ε#"@↓EJQ∀H_U
JD∧λλλ∧∧λλλ∧∧λλλ∧∧λλ∪,≤{~4n∧∀Y9L↑Y;XlT⊂εpw≥pr⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂
*DRAFT(T~∀~(~∀@@@@@@@AS]QKeekββQ↓β≤CπKπ≥#↔KMπ#gC↔ ∧αε}d⊗rα
≥gπ∂D
G'J∧λfNfT∞6F␈]HBαε≤hf.∨D∞FF(Q$ααα∧∧ααα∧
w/'∞↑Bε}d
↔'~9wπ⊗↑>ε}vM≥f:ε}↑Gπ/D
G'Jh
-L+λ≠M}λ≠{D∞{{9$
⎇~→.$≥≥≡%a"C"D∧λλλ∧∧λλλ ≤β⊂7w→P0q3]vrw:λ4yP0H::<P_w2⊂:~2P7j~2y⊂$\β niL, a tpycons relationship
involving that tty will be broken.
To put ech screen, distinct from output,
(sstatus ttycons t
(open 'tty: '(echo out tty)))
which conses tty input with a new tty output channel which is set to
go to the echo area at the bottom of the screen.
(status ttycons tty1) returns the other tty file which is bound into a
console with tty1, or nil if there is none.
filemode (status filemode file) => (open-mode-list . internal-cruft). open-
mode-list is a suitable second argument for the open function.
internal-cruft is a list of implementation-dependent information which
may sometimes be needed by special programs.
The following symbols may appear in internal-cruft. (These are the
standardized ones; additional symbols may appear at the discretion of
the implementation.)
cursorpos This file (an output tty) has the ability to position
its cursor anywhere on the screen.
filepos The filepos function can be used to access randomly
within the file.
rubout This file (an output tty) has selective erase
capability. (cursorpos 'x) will work.
sail This file (an output tty) has the so-called SAIL
character set. This is an extension of ascii which is
related to but not necessarily identical to the actual
character set used at SAIL.
If file is a closed file object, (status filemode) merely returns nil
instead of giving an error.
Page 3-82 ∪3-1.8.1 December 6, 1977
**DRAFT** The System **DRAFT**
ttyscan (sstatus ttyscan func file) allows the user to supply a function which
performs initial processing of terminal input. func is a functional
form, and file must be a tty input file. If it is omitted, the value
of tyi (the default input terminal) is assumed. Both arguments are
evaluated.
When LISP wants to take input from file, it first calls the prescan
function, which is supposed to gobble down a complete unit of input
(for instance an S-expression) and return a list of characters. The
prescanner supplied automatically by LISP when a tty input file is
first opened counts parentheses and does fancy rubout processing on
display terminals. It also implements the CTRL/k, CTRL/l, and CTRL/u
characters (as appropriate to the implementation) which allow the
complete input to be redisplayed or cancelled, and takes care of
force-feed characters. A user-written prescanner might provide
additional features such as super-parentheses, name recognition and
completion, or fancy editing.
The prescan function func is applied to three arguments: the file, the
name of the input function on whose behalf it is acting (read, readch,
or readline), and a fixnum which, in the case of read, is the count of
the number of unmatched left-parentheses. It is supposed to return a
list of fixnums, which represent characters. The prescan function
should read the input with tyi, since it and tyipeek are the only
input functions which doesn't call the prescan.
Ib the pre-scan function returns nil, an eof condition occurs for the
input file. This is the standard way to signal over-rubout.
There is a function called rubout to assist the pre-scanner in
processing rubouts. It is described on page .
It is a good idea for the prescan function to lambda-bind echofiles to
nil so that characters do not appear in the echo files twice, and so
that the echo files reflect the "clean" input after rubout processing.
The system-supplied prescan function does this.
(status ttyscan file) returns the file's func.
This feature does not presently exist in the Multics implementation.
December 6, 1977 ∪3-1.8.1 Page 3-83
**DRAFT** Maclisp Reference Manual **DRAFT**
The following status functions exist only in the ITS implementation
ttysize (status ttysize f) returns the height and width of the terminal open
as the file f. If f is omitted, the value of tyo (the default output
terminal) is used. The result is a dotted pair of fixnums "(ttyheight
. ttywidth)" (cf. cursorpos). If the terminal is a printing console
instead of a display, then the height will be a very large number such
as 200000000000 or so.
ttytype (status ttytype f) returns the type of the terminal open as the file
f. If f is omitted, the value of tyo (the default output terminal) is
used. The result is a fixnum taken from the TCTYP (not TTYTYP!)
variable in ITS:
0 Printing terminal.
1 Good Datapoint.
2 Bad Datapoint ("loser").
3 Imlac.
4 Tektronix.
5 PDP-11 ("Knight") TV.
6 Memorex.
7 Software terminal.
10 Terminet.
11 Display using standard ascii display codes.
12 Datamedia.
This status call is meant only for esoteric purposes. To find out
whether you can position the cursor or erase characters, use (status
filemode).
tty (status tty f) returns a list of three fixnums which control the
behavior of the terminal open as file f. If f is omitted, the value
of tyi (the default input terminal) is used. (sstatus tty x y z f)
sets these three fixnums to x, y, and z. If z is omitted, it is not
changed. If f is omitted, the value of tyi (the default input
terminal) is used. The three fixnums are the ITS variables TTYST1,
TTYST2, and TTYSTS. Their meaning is as follows:
TTYST1 and TTYST2 are divided into twelve groups of six bits. Each
group controls a certain subset of the ascii characters. These
groups, in left-to-right order within TTYST1 and TTYST2, are:
Page 3-84 ∪3-1.8.1 December 6, 1977
**DRAFT** The System **DRAFT**
(0) ↑@-↑F ↑K ↑L ↑N-↑R ↑T-↑Z ↑\-↑←
(1) A-Z a-z (letters)
(2) 0-9 (digits)
(3) ! " α# $ % & ' , . 8 ; ? @ \ ` | ~
(4) + * - / = ↑ ← (arithmetic operators)
(5) < > ( ) [ ] α (parentheses)
(6) ↑G ↑S
(7) ↑I ↑J (tab, linefeed)
(8) altmode (ascii 33)
(9) ↑M (carriage return)
(10) rubout (ascii 177)
(11) space, ↑H (backspace)
40 Echo the character when read by LISP (normal mode).
20 Echo the character when typed (this may disappear from ITS
soon!).
10 Echo in "image mode" rather than "ascii mode"
4 Convert lower case to upper case (applicable only to letters; not
used by LISP).
2 Activation characters. If this bit is not set, then ITS will not
schedule LISP to run when you type a character within the group
even if LISP was waiting for terminal input. For example,
letters and digits normally have this bit off, since typing one
cannot terminate an S-expression, and there is no point in
"activating" LISP until an S-expression terminator like space or
")" has been typed. An exception to this rule is that for tyi
and readch LISP asks ITS to activate on any character. Normally
only groups (0), (5), (6), (7), (9), (10), and (11) are
activators. If you alter the readtable, you may wish to change
the activator groups.
1 Interrupt characters. If this bit is not set, then even if you
have used (sstatus ttyint) to set up an interrupt function you
will not get the interrupt since ITS won't tell LISP about it.
Initially only groups (0) and (6) cause interrupts (these include
all control-characters except altmode and format effectors). If
you give @ an interrupt function, for example, you should set
this bit for group (3).
On a keyboard with supra-ascii characters, one may wish to use
meta-characters for interrupts. Suppose we want meta-D to run
the function foo. Then we would turn on the interrupt bit for
group 1 (letters) and say:
December 6, 1977 ∪3-1.8.1 Page 3-85
**DRAFT** Maclisp Reference Manual **DRAFT**
(sstatus ttyint 104 ;letter D
(function (lambda (f c)
(and (= c 504) ;meta bit
(foo)))) ; is 400
- filter out plain "D"
The third variable, TTYSTS, has these bits of interrest:
40000←22 (%TSFCO) If set, output on this terminal uses the supra-ascii
convention of an "alpha" prefix for "control" and "beta" for
"meta".
20000←22 (%TSALT) If set, ascii codes 175 and 176 are ∪not converted
to 33 on input.
10000←22 (%TSROL) If set, terminal is in scroll mode.
4000←22 (%TSSAI) If set, echoing and ascii output use the SAIL
character set; otherwise, control characters are output in
the form "↑X".
10←22 (%TSNOE) If set, defer echoing of typed characters.
2←22 (%TSSII) If set, terminal uses "super-image input" mode. Not
even ↑Z and ↑← can take their usual effect for ITS.
Notice that some of these bits affect output even though the argument
is an input file; they affect the output terminal which is logically
related by ITS to the input terminal. Normally LISP or the user will
arrange for (status ttycons) to reflect this relationship.
STATUS FUNCTIONS FOR THE OLD I/O SYSTEM
uread (status uread) returns a 4-list for the current uread input source, or
nil if uread is not being done.
(sstatus uread --args--) is the same as (uread --args--)
uwrite (status uwrite) returns the 2-list for the current uwrite output
destination.
(sstatus uwrite --args--) is the same as (uwrite --args--)
crunit (status crunit) returns a 2-list of the current unit; i.e. device and
directory.
Page 3-86 ∪3-1.8.1 December 6, 1977
**DRAFT** The System **DRAFT**
(sstatus crunit device directory) sets the current default device and
directory for uread, etc. The arguments are not evaluated.
crfile (status crfile) returns a 2-list giving the file names for the current
file in the "uread" I/O system.
(sstatus crfile name1 name2) sets the current default file names for
uread, etc. The arguments are not evaluated.
STATUS FUNCTIONS FOR THE READER
See section 13.6.2 for a description of how the parameters controlled by
these functions are used. All of these parameters are kept in the readtables,
and the status functions below deal with the readtable which is the value of the
variable readtable. Note: in the following, c represents an argument specifying
a character. If c is non-atomic it is evaluated, and the value must be a fixnum
which is the ascii code for a character. If c is atomic it is not evaluated,
and it may be a fixnum or a character object.
chtran (status chtran c) gets the character translation table entry for the
character c. This is the ascii code of a character substituted for c
when it appears in a pname being read in. This feature is used in the
PDP-10 implementations to translate lower-case input to upper case.
(sstatus chtran c k) sets c's character translation to k. f2k is
always evaluated. See the setsyntax function.
syntax (status syntax c) returns the syntax bits for the character c, as a
fixnum.
(sstatus syntax c m) sets c's syntax bits to m. m is evaluated and
returned. The setsyntax function is usually a better way to do this,
however.
Note that in the above two sstatus calls, if c is a macro character it is
changed back to its standard syntax and chtran before the requested operation is
performed. However, if in the standard readtable c is a macro (i.e. ' and ;),
instead of being changed to its standard syntax and chtran its syntax is set to
502 (slashified extended alphabetic) and its chtran is set to itself.
macro (status macro c) returns nil if c is not a macro character. If c is a
macro character it returns a list of the macro character function and
December 6, 1977 ∪3-1.8.1 Page 3-87
**DRAFT** Maclisp Reference Manual **DRAFT**
the type, which is nil for normal macros and splicing for splicing
macros.
(sstatus macro c f) makes c a macro character which calls the function
f with no arguments. f is evaluated. A fourth argument to sstatus
may be supplied. It is not evaluated. If it is an atomic symbol
whose pname begins with s, c is made a splicing macro. If f is nil,
instead of c being made a macro-character, c's macro abilities are
taken away and c becomes an ordinary extended-alphabetic character.
The setsyntax function is generally a better way to do this, however.
+ (status +) gets the value of the + switch (t or nil) in the readtable.
This switch is normally nil. If it is t, atomic symbols more than one
character long beginning with a + or a - are interpreted as numbers by
the reader even if they contain letters. This allows the use of input
bases greater than ten. See ibase.
(sstatus + x) sets the + switch tk t or nil depending on x, which is
evaluated. The new value of the + switch is returned.
ttyread (status ttyread) returns the value of the ttyread switch in the
readtable. At preseNt this iS not used for anything in the Multics
implementation. In the PDP-10 implementation it controls whether tty
"force feed" characters are used. See section 13.6.2 for details of
force feed characters.
(sstatus ttyread x) sets the ttyread switch to t or nil depending on
x, which is evaluated. Again, file defaults to t. The new value of
the switch is returned.
STATUS FUNCTIONS FOR THE PRINTER
terpri (status terpri file) returns the value (t or nil) of the terpri switch
for the file, which defaults to t. This switch is normally nil. If
it is t, the output functions such as print and tyo will not output
any extra newlines when lines longer than linel are typed out. See
also the terpri variable.
(sstatus terpri x file) sets the terpri switch.
Page 3-88 ∪3-1.8.1 December 6, 1977
**DRAFT** The System **DRAFT**
← (status ← ) returns the value (t or nil) of the ← switch for the
current readtable, which defaults to t. If this switch is t, the ←
format for octal fixnums with lots of trailing zeroes is not used.
(sstatus ← x file) sets the ← switch to the value of x, t or nil.
abbreviate(status abbreviate) returns the value of the abbreviation control.
See section 13.7 for a description of the abbreviation control. Note
that the abbreviation control is kept in the current readtable.
(sstatus abbreviate n) sets the abbreviation control to n.
(sstatus abbreviate nil) turns off abbreviation.
(sstatus abbreviate t) turns on a maximal amount of abbreviation.
STATUS FUNCTIONS FOR THE GARBAGE COLLECTOR
gctime (status gctime) returns the number of microseconds spent garbage-
collecting.
(sstatus gctime n) resets the gctime counter to n and returns the
previous value of the gctime counter.
It is a good idea to do (gc) and then (sstatus gctime 0) just before
dumping out a subsystem. See also (status gcwho).
spcnames (status spcnames) returns a list of the names of all the spaces
available in the LISP being used. These are the names acceptable to
the alloc function and to the following status functions which require
a space argument.
spcsize (status spcsize space) returns the actual, current size of space, in
words. space is evaluated.
gcmax (status gcmax space) returns the gcmax parameter for space.
sstatus gcmax space n) sets the gcmax parameter for space to n.
See the alloc function.
gcmin (status gcmin space) returns the gcmin parameter for space.
December 6, 1977 ∪3-1.8.1 Page 3-89
**DRAFT** Maclisp Reference Manual **DRAFT**
sstatus gcmin space n) sets the gcmin parameter for space to n.
See the alloc function.
gcsize (status gcsize space) returns the gcsize parameter for space.
sstatus gcsize space n) sets the gcsize parameter for space to n.
See the alloc function.
purspcnames purspcnames) returns a list of names of spaces which have pure
(status
versions. See purcopy.
pursize (status pursize space) returns the size of the pure version of space.
Only spaces returned by (status purspcnames have pure versions.
pdlnames (status pdlnames) returns a list of the names of all the pdls
available in the LISP being used. These are the names acceptable to
the following status functions which require a pdl argument.
pdlsize (status pdlsize pdl) returns the current number of words on a Pdl.
pdlroom (status pdlroom pdl) returns the "pdlroom" of a pdl, i.e. the maximum
size to which it may ever grow.
pdlmax (status pdlmax pdl) returns the current value of the pdlmax parameter
of a pdl.
(sstatus pdlmax pdl size) sets the pdlmax parameter for the pdl space
to size. Both arguments are evaluated. See also the alloc function.
The following status function exists only in the PDP-10 implementation
memfree (status memfree) returns the number of words of address space not yet
allocated for any purpose (i.e. still available for allocation to
various spaces).
EJVIROJMENT ENQUIRIES
Nkte: the various enquiries related to time may return nil in the rare
circumstance that LISP cannot determine what time it is.
Page 3-90 ∪3-1.0.1 December 6, 1977
**DRAFT** The System **DRAFT**
date (status date) returns a 3-list indicating the current date as (last-
two-digits-of-the-year month-number day).
dow (status dow) returns an interned atomic symbol which iq the name of
the current day of the week.
daytime (status daytime) returns a 3-list of the 24-hour time of day as (hour
minute second).
system (status system x) returns a list of the system properties (that is,
properties whose values are supplied in the initial LISP system) of
the atomic symbol x, which is evaluated. This list may contain subr,
fsubr, lsubr, macro, autoload, or array if x is a system function, and
value if this atomic symbol is a system variable.
uname (status uname) returns an interned atomic symbol whose pname is the
user's login name. In the ITS implementation this is just the .UNAME
. In the Multics implementation this is in the format
User.Project.Instance; the dot will be slashified if print is used to
display this. In the TOPS-10 implementation this is actually a list
(proj prog) representing the project-programmer number rather than a
symbol. See also (status xuname).
udir (status udir) returns the name of the user's directory. In the ITS
implementation this is the user's "master sname", which is usually the
same as the user's name as returned by (status uname). In the Multics
implementation this is the user's default working directory. In the
TOPS-10 implementation this is a list (proj prog).
LISPversion
(status LISPversion) returns the version identification of LISP. This
is usually an atomic symbol.
jcl (status jcl) returns the "job command line" from DDT in the PDP-10
implementation. This is used to specify the init file, but
interpretation of the file name is terminated by altmode, and (in the
ITS implementation at least) additional information may follow the
altmode. The init file may wish to examine this information. In the
Multics implementation this returns the explodec'd second argument of
the LISP command, or else nil if the LISP command did not have two
arguments. If LISP was invoked by
LISP environment←name "foo bar"
December 6, 1977 ∪3-1.8.1 Page 3-91
**DRAFT** Maclisp Reference Manual **DRAFT**
then (status jcl) => (f o o / b a r)
This function is also used by subsystems implemented in Maclisp to
pick up the arguments from the command which invoked them.
The following status functions exist only in the PDP-10 implementation.
xuname (status xuname) in the ITS implementation returns the .XUNAME as an
interned atomic symbol. The xuname of a job is the name of the user
for whom it is being run. This is normally the same as .UNAME with
trailing digits stripped off. It is possible, however, to cause a job
to be run with a different xuname. System initializations should
check the xuname to determine which init files to use. In the DEC-10
implementation this is the same as (status uname).
jname (status jname) returjs the j@=DA]C5JACF↓C\AS9iKe]∃HACi=[SFAMs[E←0X ↓α&C∀4)α↓↓↓↓α↓↓↓βVsπ7∃ε{⊂∩ε∀ &}∩
_d(λ≥-m<=1$
9→;NM9Z9.$→[tD
=λ⊂-]{Yh≥≠λ≠lDλ≥~T≥<y.$|c"D∧λλλ∧∧λλλ
-x\kD∧∩;H∞M→(λ ~α)P4[x62vYw:0z~ww⊂:~4yP4\β the job's .JL¬β≠
\@@A%\AiQ∀~∀@@@@@@@A Zb`A%[aYK5K]iCQS←\AQQSfA%`
β;vr2&Nαaβ←#-∪∃β;vqβ'Mπ##∃βT¬v∩α
nVn⊗↑$εNpQ$ααα∧∧ααα∧F.≡≥\⊗bpQ!PWF-l⊗n*∧∧ααG>L↔'/4∂εFV≥\RJε≥dαπ&T∧M¬4
⊗oεL]V.wL≡FN}d∧π⊗/NXMnh≥~TP%∪ fbPλ0yP0[εE⊂⊂λ⊂⊂⊂⊂λ⊂⊂4w≥2y72Y⊂0z7[tqP9↑vq7v⊂⊂*4~yP4yH77y6Xv6<P≥42P7_vrP7Y⊂:42H897s\0vP:~0zεEλ⊂⊂⊂⊂λ⊂⊂⊂⊂≥42P:\ry⊂4[;7urY⊂:7P_y2pz→P:44\P57q⊂⊂*y]pv6<H:44yH;tv6λ12P:~2P9p[rP0yCE⊂⊂⊂λ⊂⊂⊂⊂λ⊂:42H570vYV⊂1:]⊂9pP≥yry⊂_pw⊂4[;7urH9r{2\0v⊂1[x4ryH7s⊂0H897s\0vP0]⊂7w1YVεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂2Xqt⊂4_{4w3H⊂0P:[4xzrH570vYP⊂1:]⊂0v6λ40{$[3P⊂:~2P9p[rP<5≠0vrWλ⊂⊂$wλ:42FB⊂⊂⊂⊂λ⊂⊂⊂⊂λ""aVLX⊂4v\62vr[:0z4[w⊂:4~yP;t[6⊂⊂9→z:y7λ:42P~7q∪yH⊃897Yy0vPλ70vrH↔⊂⊂'[εE⊂⊂λ⊂⊂⊂⊂λ⊂⊂&z[:4qyK⊂4z⊂≤t7zv→⊂92z≥y7⊂∀≤z0z:\P0y3H_∀WεBεE9rYv7sPλ⊂⊂∀9]0z:yH⊂9rs[7sTP≤2z:y≠9P⊂:~2P⊂6≠spy4]46P∀_0yrPλ→∀P⊂≠s⊂:4→P⊂9t↑2P⊂7Y⊂0FEλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ9rsvYw:⊃⊗λ:42P≥w4z⊂≠s⊂9x_qrP0[67qp]4ww↔λ⊂∀*4→P9t⎇→P7s⊂_P⊂9rYvrw:λ72rrβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂77zλ12P:~2P9p[rP0yH:42P≤t⎇2P≠s⊂0P≠rvwy≡P80sYW∀FEβE⊂⊂⊂∃42P3≠v67{Zw3P9]0z:yH3:w1]4ww9H7w6<H2|4y]⊂4w⊂≥42P$U)P4v\62vr[:0z4[w↔εEβE4z9H⊂⊂⊂⊂λ⊂∀9z_z:yP~z9TP≤2z:y≠9P⊂0H64yzλ7s⊂3~{2P⊂~z2vyH∀7q:_tw2rλ397vH⊂:42H)ij U*FE⊂λ⊂⊂⊂⊂λ⊂⊂⊂9↑vq7v~qP9|\z2vP_pv6∀NεEεEλ⊂⊂⊂⊂λ⊂⊂⊂⊂
_TP⊂∃42P⊂_vwzw≥⊂7s⊂λ:4vrH4w⊂⊂≤rqww→9P:w≥4v⊂⊂∩j)P4\P⊂3wZw3P2≠{w⊗⊂λ0yP0CE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂367[:vV⊂λ⊗XW_λ4s⊂⊂∩j)P2≠ryw∪]⊂⊂86_w⊂:7H⊂3wP→7{w⊗λ⊂7y⊂Y↔_⊂λ4s⊂$U)FE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂0[92pr≡P4yP→7{w↔βEεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀∀P⊂0H34|7≥vP;t~qt⊂4\P77w≡2y7P~s⊂$j∀P4yP_2tw3H22q:Ysrr↔βEεE(_srP→K\Y⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∧YVXW∞↔_P⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂"2Xrvq2\⊂≠⊗⊂\[[FBβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ*42P∀|yz2[P⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*∃
εEεEβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂∀→TH⊂:42H7:vq→y⊂7sλ:yry≤P67sYrr⊂4[⊗⊂0yH0P34↑7:vWβEεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀
∀P⊂:~2P7:[q2y⊂≠s⊂6r[wy<P→y97y≤P:42H9|yz→vP40\P9zy≥4{2r⊂0yP_P34|≠:vWεBεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀~JP⊂:4→P:4vYP4w⊂≤rqww→9P:4→P9|y]2vP4_yP12Yw⊂:x⊂0yP_P367[:vWεB)wvrH7s⊂⊂≥44yP~w37y≠pz4w[⊂⊂6p↑P12Pλ7s⊂:\rP:7H⊂0P:\ry⊂⊂~0w26→y⊂37\⊂⊂:4→P9|yKr2pz~εE4w≥2y9:\:↔εEβE40q]97⊂⊂λ⊂∀9z_z:yP~0qz9≠∀P92]:y79H0w⊂⊂_z7vtXP9|vX7v⊂4[24qp]4w3P≥t0z⊂~tw2⊂λ7s⊂5≠qεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂4\P9zx→y4wyλ:7P⊂≥42P&∩ih↔⊂λ!zy9→w:⊂8≠yytq~v4z4YyP⊂0\2P22≥⊗⊂&$Th⊗⊂⊂≥⊂∀0FB⊂⊂⊂⊂λ⊂⊂⊂⊂λ9zx2\4wy⊂≠s⊂:w~w7{wλ:<x2JV⊂0w→⊂74vλ∀77P≤zx2y~wy∀WβEεE⊂λ⊂*42H37v6≠{tw3H9z0z≥yP3:[1z4w[9P2|~yz⊂7[6<P4[⊂:42H&zv:~qyP4[x62vYw:0z~ww↔εBεE80Ytw3Pλ⊂⊂∀9]0z:yH80st[3TP⊂≤2z:y≠9P0Pλ64yzλ7s⊂:~2P⊂8_stw3Kr2{4XrP80YrP⊂9→pr9P_w2εEλ⊂⊂⊂⊂λ⊂⊂⊂⊂≥7z0vλ80srH92pr≤P:40]⊂40{→P12r[⊂1pz\rr⊂1≡P:44\P897XryyWβEεE0\3P⊂⊂λ⊂⊂⊂∀≤z0z:\P⊂0y→P⊂7∀H92z:\79P⊂≥42P⊂≠∃XSz~⊂0y3]vrw:λ⊂7s⊂λ:42Pλ1wvvXw2⊂;Z4qtεB⊂⊂⊂⊂λ⊂⊂⊂⊂λ4w;7Zrr⊂⊂≥42P⊂≤zq9|\z2vVλ0yP⊂_w⊂⊂4[:2y7→r⊂0z≠vtqPλ9|vq≠v↔⊂⊂λ∀*42H34y9]εE⊂⊂λ⊂⊂⊂⊂λ⊂⊂0y→zvrw≥⊗⊂⊂∀≤z0z:\P0y3H⊂_∀Vλ⊂4yP≥42P⊂≠0vrPλ7s⊂:~2P⊂9]q9|y]2vW∀H⊂74vλ4yFEλ⊂⊂⊂⊂λ⊂⊂⊂⊂≤2z:y≠2r⊂4Y⊂7⊂4\P3y2Xz2y⊂≥40w⊂≥42P7≥vq2yλ7s⊂0\3zvr[:9P:≠P:42H1wvvXw2↔εBεE)j⊂j*iP⊃*g!j∩gg)P⊃'i⊂*∩"P+d∪Vf$g⊃FEεEλ⊂⊂*4→P37v≠7{tw→P9z0]:yP3≥w1z4[w9P2↑4yz⊂≠w6<P~w⊂:4→P$j)H4vx6→vrw:_z4wwεEεE≥t7v⊂λ⊂⊂⊂⊂
9yz0]:yP;Z7v⊂0H⊂1⊂1H2∀P9Yz9P⊂→7zy⊂≥yry⊂≤0y0vYz2y9H37y⊂λ:42Pλ;t7V[4w2QβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂;t4Xt⊂0x≤2py9H0z⊂:~2P17]:7vP≠s⊂9w[rP24\x60|H:2y6Zw0v9K⊂⊂⊂*~2yrP_ww:9≠vεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂:~2P89~w:⊂3≠y6pzλ7s⊂4[37y6Xz4wwλ9x2qZs4rrλ1<P∀≤yz0z≥yP⊂;Z7Y∀Vλ∀9yz_z:yFB⊂⊂⊂⊂λ⊂⊂⊂⊂λ;t7YJV⊂0w→⊂⊂∀9\z0z:\P3q{Z7TW⊂λ⊂"pqZ⊂7s⊂λ:42P→7zy⊂λ80y0[rz2y≤P9x2Xts4rYεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂2tYt:⊂1~ormation. Parameters a and c must be fixnums; b and
d may be fixnums or atomic symbols (which represent the ascii value of
the first character in their pnames). Their meaning is as follows:
a If 1, suppress display of entire who-line.
200
100 If 1, suppress space between halves of who2.
70 Mode for printing high 18. bits of who2.
7 Mode for printing low 18. bitq of who2.
b If non-zero, print between halves of who2 as an ascii character.
177
200 If 1, Print chabacter twice,
α
c If 1, suppress space between who2 and who3.¬
200
@ec@∃[EKdhX@bdnf@@@@@@@@@@@@@@@@&f4b\`!s ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓αC∞;∃↓MkIL4(1)*%∩ε~QRQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓∧kπ∂3M≠AαK,3↔K↔v≠∃α↔∞sWπ⊃α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓%(E∀j@
E! C"AQHλλ∧∧λλλ∧∧λλλ∧∧-edλ<h⊃M}H_ ⊗λ1:z_q32a]9P;t≠YSεEβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂2⊂⊂λ yP#≠y⊂1, butabfe@
ifAo!↑fL~(@@@@@@@@fnn~(@@@@@@@@↓)QChαβ'MD∧εN∩∞Mε*π⎇
rnf≥lRαε≡4ε&O> F∂N\@ε∂"∧⊗fBβλ⊂~~2P⊂:\py⊂ )nfgrmation
ap@AKCef↓S\Ai!JAM←β∪5h∀Ph)↓↓α↓↓↓↓α↓αBBα→
-~~∃m**%∀∧¬:5≥≥1Q hR∧∧ααα∧∧ααπ⎇W⊗+!Q hR∧∧ααα∧∧αα¬
¬αα∧
&/∨]JBε↑d∧ππ⊗≥nFNvt
FF*
⊗.Bε∪αbα-↔'~
|bπ>
v"ε∂4∧π∨ε\9⊗&N\@ε↔HQ$ααα∧∧ααα∧
↔4≥~→!QHλλ∧∧λλλ∧∧λλλ∧∧_)|dεlλ_M≡≤kC!!"Hλ∧∧λλλ∧∧λ∀4*~(λλ∧Z9≤d
yH≥m
lKλ/(_in4
h⊂M≡≤kC!$λλλ∧∧λλλ∧
≠⎇hε↔C"AQHλλ∧∧λλλ∧∧∀TTJ$.DZ8
9H7s⊂;Z7YV⊂_<P1S\P≠X⊂_4z9WβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂44sZεEεEλ⊂⊂⊂⊂λ⊂⊂⊂⊂∀iiiPλ⊂⊂14]9P7sλ;t7YK⊂1<P_SyP≠H14z9KεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂67]P_\↔βEεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊃HP⊂⊂:≠P:;wH1t0y_qz2y≤V⊂9x→qts4Yr⊂1<H2↔εEλ⊂⊂⊂⊂λ⊂⊂⊂⊂≡2y7FBεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊗Pλ⊂⊂⊂⊂≥w62y\P0SyH_X_⊂_4z⊂4\P9rzεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂9x_qrVεBεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂≡Pλ⊂⊂⊂⊂≥w62y\P1SyH→__⊂_4z⊂4\P9rzεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂9x_qrVεBεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂∃Pλ⊂⊂⊂⊂≥w62y\P1SyH_X_⊂_4z⊂4\P9rzεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂9x_qrVεBεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂*4→P87y\tq62H894w≥⊂6wr→yP0y→]εEεB⊂⊂⊂⊂λ⊂⊂⊂⊂λ_⊂⊂7≠z⊂89~w:↔εB⊂⊂⊂⊂λ⊂⊂⊂⊂λ"7FEβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂_P⊂λ⊂4w⊂≤0qurY⊂37y≠]εE⊂λ⊂⊂⊂⊂λ⊂⊂⊂"_z2FEβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂≠[Z__⊂,Ypy⊂6[r⊂_X↔εEεB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂→[_⊂&w[:4⊂∀∩0w:p\<P≡PTFEεB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂_MZ⊂"0↑P7s⊂≠ww:4εE⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂(9~w:2rλ0yP6[Wr2↔↑|WεEβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂→⊂⊂λ⊂4w⊂→7y:4Yz49P≠s⊂0P≤rqww→↔⊂⊂(≤4w:2Y⊂0yP~4≥6vN9yW:εE⊂⊂λ⊂⊂⊂⊂λ⊂⊂*4[rFEεB⊂⊂⊂⊂λ⊂⊂⊂⊂λ→P⊂⊂λ4w⊂4_v3⊗yYqww2≤V⊂89~w:2rλ0yP4~≥6v]≤yWεEλ⊂⊂⊂⊂λ⊂⊂⊂⊂∃4vrFBεE(0YrP→VNZ⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂ LVXW≤_P⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂"2qYvq2yλ≠⊗⊂_N[[FEβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ*42P∀|yz2[P⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*∃
εEεEβE⊂⊂⊂λ⊂⊂⊂⊂λ⊂~⊂⊂λ⊂⊂7:[q2y↔βE⊂⊂⊂λ⊂⊂⊂⊂λ⊂'qz_vεEεB⊂⊂⊂⊂λ⊂⊂⊂⊂λ~P⊂⊂λ⊂⊂⊂7≥vq2yλ∀77Pλ↔⊃⊂4\P894[:2r∀KεE⊂⊂λ⊂⊂⊂⊂λ⊂⊂"2XtvpvβEεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂≠λ⊂⊂⊂⊂≤t|14]⊂1t0\0qz2\9WεEλ⊂⊂⊂⊂λ⊂⊂⊂⊂∃492rCEεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂≠CE⊂⊂⊂λ⊂⊂⊂⊂λ⊂*w:\rr↔εB⊂⊂⊂⊂λ⊂⊂⊂⊂λ∀9z0]:yP;Z7XTP≤2z:y≠9P0P≠4yz⊂≠s⊂37]y⊂34↑7:vyH∀0P1λ1P2∀KεEεE≥t7Y⊂λ⊂⊂⊂⊂
9yz0]:yP;Z7Y⊂<
P9rz≤P:42H;t7Yλ;0y4Xq62P≥7P<⊂~s⊂4zλ4yP0H34|7≥vV⊂⊂≠y⊂:7CE⊂⊂⊂λ⊂⊂⊂⊂λ⊂:42H9t|1~z⊂;0[:rP7Y⊂:42H34y9]⊂⊂9t↑⊂1t0\0qz2\9P7sλ:42P≤70vrH7s⊂<λ⊂4s⊂~zεE⊂λ⊂⊂⊂⊂λ⊂⊂⊂4\P0P9↑vq7v⊂⊂∀9]0z:yH;t7Yλ<∀P9→z:y7≤P;t7L⊂0yP_P34|≠:vWεBεE;t≠YP⊂⊂λ⊂⊂∀9\z0z:\P;t7LP<∀P_w2⊂∀≤z0z:\P;t7LTP0y→P0w0[7swz\P:7P≥47yrH37y⊂≥t7Y↔βEεE"↑0vx6→]εE⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀_v6⊂7≥vq2y≤P4w⊂≠qz0v
FE⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀9\z0z:\P;t7LP_[≠λ_⊂_Z
⊂→~Z
FE⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀9\z0z:\P;t7L⊂∪c'Sa i∀CE⊂⊂⊂λ⊂⊂⊂⊂λ⊂∀9y]0z:yH;t7YH∀∃P∀∪)d⊂_L→Z⊂→∀P→Z
[∀TFB;wzv→⊂1pz\rP⊃#∪ga iλ_Y→Z⊗→Z~M⊃⊂:7H0x82Xy⊂4wλ:42P≥t7Vv~w2W⊂λ*42P→rw2y_v⊂⊂4Y2pP4\FE:4_z⊂:4→P:yr\⊂9t7]v2⊂9Yz⊂:xλ;t7XH5:yzλ7w1rH0w2⊂≥42w⊂~rrx⊂≥x20z~w3P;Z7Y⊂⊂_w2⊂;Z7YFE_yP0x≤97x9~pz2Wλ⊂#7yλ2|0v\62V⊂_P97z]4w3P≥40z⊂≤97qr\yrr⊂→:w1z~ww9P~w⊂⊂3~v2yP≠tst:βE27FB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀≤yz0z≥yP;t≠XP_[
⊂_⊂_M≠⊂_∀CE0w2λ7w⊂7\2w4w→P0P7→{P34[2P27CE⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂
9yz0]:yP;Z7Y⊂∀_pr9⊂
:9:w_vrP4[34v2JTTFEλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂∀9\z0z:\P;t7LP_∀FB0w2⊂≠w⊂2w_wzw:→y4w3H0P3:[1z4w[⊂27FB⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂∀≤yz0z≥yP;t≠YP37≠0vrTCE0w2λ9wP1[w:4w≥wzyv≡P24y\60|P≥42P3~v2w0[rP0w→⊂3:w_z4wwλ70vrH12tw→P897XryyrY↔⊂⊂'[2FE0Y;0w:_srP7Y⊂27t[3P⊂:~4yP7]2y⊂8≤4w:4[3P:4→P⊂4w→7y6p]4ww⊂~yP:4_z⊂&$Th⊂⊂1Xw⊂:x→0z2FB;t7V[4w2P~w37y≠pz4w[⊂2{2[⊂:47]st⊂4]⊂27r\w∪z⊂~0{2P_ww:9≠v⊂7sλ:42P_ww9w[2WεEβEεE3X{t7Pλ⊂⊂⊂∀≤yz0z≥yP3q]t7P7
P9rz≤P:42H3q{t≠P9{t]1t⊂:≠P7↔⊂λ!zy9→w:6<H7w6<H⊂:42H67{FB⊂⊂⊂⊂λ⊂⊂⊂⊂λ:;wP_4z9P_y2P9Zsw4s~qpw:εEεEλ⊂⊂*4→P⊂_P_4z⊂⊂≠rpw9H:40zλ⊂2:y~w3P0H⊂3py_0srP_wv62Xz4wwλ⊂:42H;t7V[4w2Pλ9t7z[2⊂12CE:yz\82r⊂≥7P⊂2~yx60↑P:42H6ryyXsrP⊂λ#a],⊗,,⊃⊗λ;t2y→P⊃,,⊗,⊃⊂⊂~yP:4→P92p\ww⊂⊂→7y⊂:~2FE3Xy10sYP1wv≠2qz4[w↔⊂⊂∪w⊂1w[x62z~ww⊂⊂≠s⊂:4→P3py_0srP_wv62Xz4wwλ:42Pλ7y4sZw0v⊂≥yryεB;t7V[4w2P~w37y≠pz4w[⊂4yP≤2yz7\2r↔εBεEεE⊃2qrvX2y⊂≠⊂_\[MP⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ YVXK≤↔_Pλ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ(0srH→V\ZCEβ∃∃")⊂c*∃∃λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂&Xqv4y\⊂)2s→y2w1YP&pw≥pv⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂λ⊂∃∃"∀ c*∃
εEεEβE⊂⊂⊂∃42P→λ⊂14zλ6rpw≤P⊂:4_z⊂0zλ⊂:42H2w2⊂≠s⊂⊂:~2P3p\10srH⊂1wv≠2qz4[w⊂:4→P⊂;t≠Y⊂;w\2εE9Z7zv2λ12P0[:2y2Y⊂9wPλ:40zλ:42P≠7{P_N↔⊂14]9P⊂3Yz⊂:4→P92y]v:⊂7Y⊂⊂∀9]0z:yH3qz4[rTVεB1ww;→y:2rλ:7P3≠y:4r]49P7Y⊂0P9Yqww2⊂0w2λ⊂:42H44stλ_\⊂1~z9P3Yz⊂:4→P92y]v:⊂⊂≠s⊂∀↔KFE∀∃λ∀9z0]:yP3Xz4vrJP_X_∀T9:[:4vrJTV⊂;Z4qt⊂~yP:4→P82y_rw:0YrP7sλ:4vrH9x2w≥⊂4w⊂→qWεE∩s⊂:4→P:yr\⊂3t{→yP~Yλ7qz0[⊂0w2λ∪RP0\P:42H34y9]⊂:;wH0y3z[rw:9H:7P⊂
9yz0]:yP;Z7XTVβE:42[⊂:42\rP8zXw:4z~ryP;Zv6⊂1→P24y\60qrY⊂4w⊂≥42P3≠y6P⊃≠7∩P4~≥6vM≤yW:⊃⊂⊂5:\z⊂64ZrFE:~2P9z_w20y→⊂9|y]2vP9]0z4y]4qyPλ37y⊂≥42P&∩ih⊂5≠q↔⊂⊂λ*42P≥yry_pw⊂9]4v6⊂λ:yrP≥t7YFB37y⊂~4yP7]w⊂8:\87yr\UεEεB⊂⊂⊂)]q9|y]2vyP≥t4qtλ:yrP
9yz0]:yP3X{t7TH9t7z[2⊂82\37y6CE
(gc)
(sstate@LAOGi%[@∃↓αH4+,3?K∃αβ∪W↔εK;≥β␈+Q↓β&C∃βO,∪OgO&+5 "∧∞6zα∞Mε∂"∞Mε*α|2π&≥\RαπZ&≡.nL⊗>/4∧π>NMDε⊗(Q(λ,<⎇<X.L(C!! ¬⊂⊂λ∀9z0]:yP3X{t7TH92z:\59P*~2P;0[8¬e od∧AiQ∀AOGo!↑Ago%iGP\4∀~¬≠%'π→1β∃∨U&A'$
RVM∧2V:∞αI∀l@Tc"AQY=P-M≠{rd∧nables the evalhook feature; (sstatus evalhook
nil) disables it. (status evalhook) returns the state of the switch.
See page 3-32 for the details of this feature.
toplevel (status toplevel) returns the top-level form, which is continually
evaluated when LISP is at its top level. If this is nil, a normal
read-eval-print loop is used.
(sstatus toplevel x) evaluates and returns x and sets the top level
form to this value.
For example, to make Maclisp have an evalquote top level similar to
LISP 1.5:
(sstatus toplevel
'(progn (print *)
(apply (read) (read)) ))
See section 12.1 for further details.
breaklevel (status breaklevel) returns the break-loop form. (sstatus breaklevel
x) sets this form. See page 3-6 for how this is used.
Page 3-96 ∪3-1.8.1 December 6, 1977
**DRAFT** The System **DRAFT**
uuolinks (status uuolinks) returns a number which represents the number of
available slots for linking between compiled functions. (status
uuolinks) returns nil if no uuolinks pages have been set up yet (see
pure). Otherwise it returns a list of two items. The first is t if
area 2 has been purified (and so no new calls may be put in the area),
and nil otherwise. The second is the number of slots not yet used in
the uuolinks areas.
(sstatus uuolinks) causes all links between compiled functions to be
"unsnapped." This should be done whenever (nouuo t) is done to insure
that the interpreter always gets a chance to save debugging
information on every function call.
divov (status divov) returns the state of the "divide overflow" switch. If
this switch is nil an attempt to divide by zero causes an error. If
the switch is t the result of a division by zero is the numerator plus
1.
(sstatus divov x) sets the "divide overflow" switch to x.
In the PDP-10 implementation, divoV applies only to quotient. // and
//$ do not detect division by zero.
mar (sstatus mar cond loc) arms the mar (memory address register)
interrupt (currently available only in the ITS implementation).
(status mar) returns a list of cond and loc, or nil if the mar feature
is not in use. See the mar break feature for more details (page 3-
56).
features (status features) returns a list of symbols representing the features
implemented in the LISP being used. The following symbols may appear
in this list:
bibop PDP-10 big-bag-of-pages memory management scheme
lap this LISP has a LISP Assembly Program loaded
sort the sorting functions described in chapter 11 are
present
edit the edit function described in chapter 18 is
present
December 6, 1977 ∪3-1.8.1 Page 3-97
**DRAFT** Maclisp Reference Manual **DRAFT
*
fasload the fasload facility described in chapter 14 is
present
↑f the "moby I/O" facility is present
bignum the arbitrary-precision arithmetic package is
included in this LISP
hunk the hunks data type and its associated functions
are present.
funarg the "fake funarg" feature (second argument To eval,
third to apply, etc.) is present.
strings character strings afd the functions on them
deqcribed in chapter 8 are present
newio the I/G fqncTions descpibed in chapter 13 are
included in this LISP; id∧AiQ%f@AM∃Cike∀@ASf↓]←h~(@@@@@@@@@@@@@@@@@@@@@@@@↓aeKg∃]h@@↓←]Yr@Ag←5J@A←_@@Ai!←gJ@AMk]
iS←]L@ACe∀~∀@@@@@@@@@@@@@@@@@@@@@@@ACm¬SYCE1J\~∀4∀@@@@@@@@@@@Ae←[¬\@@@@@@@↓iQSf↓→∪' AGC\↓eKCH↓C]H@↓aeS]PAe←[¬\@A]U[KeC1f@Qg∃J~∀@@@@@@@@@@@@@@@@@@@@@@@AE¬gJAC9HASE¬gJ\~(~∀@@@@@@@@@@@Aie¬GJ@@@@@@AiQJ↓ieCG∀AaCG-COJ@!GQCaQKd@bTRASf↓aeKg∃]h\~(~∀@@@@@@@@@@@AOe%]IKL@@@@AiQJ↓Mk]GQS←\@↓IKMS9SiS←8AM←e5CiiKH@QGQ¬aiKd@blR↓Sf~∀@@@@@@@@@@@@@@@@@@@@@@@AAeKgK9h\~∀4∀@@@@@@@@@@@AOeS9H@@@@@@@↓iQJA→SYJA→←e[CQiKd@!GQCaQKd@bXRASf↓aeKg∃]h\~(~∀@@@@@@@@@@@AG←5aSYKH@@@@AiQSLASfAQQJA→%' AG=[aSY∃d@QG!CaiKH@bhRAeCi!KdAi!C\~∀@@@@@@@@@@@@@@@@@@@@@@@AQQJAS9iKeaIKiKdQgKJ↓CYg↑↓G←[a%YKd[MiCiJ$\~∀~(@@@@@@@@@@@@↓MCgi¬eSiP@@@AQQJ@A→Cgh[¬eSiQ5KiSF↓MKCiUeKf@↓←LAi!J@AG=[aSY∃dACe∀~∀@@@@@@@@@@@@@@@@@@@@@@@Aae∃gK]h4∀~∀@@@@@@@@@@@A[0@@@@@@@@@AiQ%fA→∪M ASf↓←\Ai!JA≠CQQ→CD↓[CGQ%]JACPA≠∪(4∀~∀@@@@@@@@@@@AC$@@@@@@@@@AiQ%fA→∪M ASf↓←\Ai!JAβ∩↓[CGQ%]JACPA≠∪(4∀~∀@@@@@@@@@@@A[@@@@@@@@@AiQ%fA→∪M ASf↓←\Ai!JA≠ε↓[CGQ%]JACPA≠∪(4∀~∃!¬OJ@f4rp@@@@@@@@@@@@@@@@@@@@@@LfZb\`\b@@@@@@@@@@@@@@@A K
K[EKH@lX@Drnn~(**DRAFT** The System **DRAFT**
SAIL this LISP is running at SAIL
H6180 this LISP is on an H6180 Multics machine or a
compatible machine such as a 68/60 or a 68/80.
its this LISP is on some ITS system
Multics this LISP is on some Multics system
TOPS-10 this LISP is on some DEC TOPS-10 system; or on some
TENEX system since the TENEX implementation runs
under a TOPS-10 emulator.
A package being "present" means that it has been loaded into the
environment. If (status features) claims it is not present, it may
still be available because it may be automatically loaded when
required. This does not apply to the compiler.
(car (last (status features))) is an implementation name, such as ITS
or TOPS-10 or Multics. The main idea behind this status call is that
an application package can be loaded into any Maclisp implementation
and can decide what to do on the basis of the features it finds
available.
feature (status feature foo) is roughly equivalent to (memq 'foo (status
features)), i.e. it determines whether this LISP has the foo-feature.
Note that foo is not evaluated.
(sstatus feature foo) makes foo a feature. foo is not evaluated. For
example, the trace package does (sstatus feature trace) when it is
loaded.
Example:
December 6, 1977 ∪3-1.8.1 Page 3-99
**DRAFT** Maclisp Reference Manual **DRAFT**
(cOnd ((status feAture bignum)
(prog2 nil (eval (read)) (read))) ;use first
(p (read) (eval (read)) )) ;use secOnd
(defun factorial (n) ;bignum version
(cOnd ((zerop n) 1)
((timas n (factkrial (sub1 n))))
))
(defun factorial (j) ;fixjum
only vers@%←\~∀@@@@@@@@@@@Q⊃↑@PRPQ]←P@P|A8@bf\$RR@@mI↑Ak9iSXAαq↓p"z↓EM_hQ↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓#↔↔∪?I↓⊗K∨Wn+;Qβ&{=βN9↓5β4∧⊗∨&}-⊗∞b!Q"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα
aPRα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧w?⊗lqW'OUV∂⊗u∃⊂hR∧∧ααα∧∧ααα∧∧ααα∧¬ε≡}lDαBG,↑&␈α
a∩β
⊃Q"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααᬬαRεd¬ε6∞>Mw⊗N≥DαC
T
bJJ∃∀αJHQ!PVv|lV∂'↑,RαG>>F∂'↑4αεv|lV∂'↑,Rε6⎇u∩αε\≥6/~∧f}z
mw"α,Rαε∀λf.∂NZ&*r∧∧ε6↑t∧εO~
mw H$∧ααα∧∧ααα↑f∞g\≡F."aQ hR∧∧ααα∧∧ααα∞>F∂'↑4εv}lX↔'/,Tε6}u∀εO~Z↔.Ol≥F∞wD
Fzα
mw"α∞>F∂'↑4ε6.≡NW⊗*ivzJ∃aPPh.>F∂'↑4ααα¬∞7&∂NZ2π∨L≡G/~mvzJ∞,W'∂-n2π"∧
⊗"εm⎇rεO4∩π6≥M⊗"π>L↔'/4∧ε7.l>FN}edα∧NaQ"αα∧∧ααα∧∧εO"
≡2εv}EBεv≥DεO~∞,W'∂-lV"pQ!PRα∧∧ααα∧∧ααG>L↔'/4∞7&∂NZ2Jπ,↑G/⊗n4ε
α
M↔∨"
|bπ6≥M⊗"π>L↔'/4g.v>M⊗}w5dαα¬MRεv≥\W_h$∧ααα∧∧ααα≡&*πN.Vv≡≡LV"πMtαπ≡⎇\RεN↑
F.n]nF∂&≥⎇bn&↑Vv&]nBεw]\&/∩∧
v"ε=↔⊗∞>LW↔~AQ"αα∧∧ααα∧∧π∨.=∧ε∂~εDε␈∩εU`hPQ.7∨&≡NW~α∧¬π∨&≡NW~π>>F∂'↑4ε6}u∀π⊗/N↑&w~∞DεN2mvzε≡4ε
πl≥FN"∞>7&∂N↑2ε7]l7&N⎇ebα∧≤aPRα∧∧ααα∧∧αεOD
↔~εm}Bbεm≥BεO4∞&/'↑-f."aQ hR∧∧ααα∧∧ααα∞>F∂'↑4π∨∨L≡G/~∀∞&/'↑-g~ε∀∧εfO>Dε}2∞l⊗fND∞7∨&≡NW~εn]f∨&≥⎇g~r∧∧∧∂~∞⎇↔&@Q$ααα∧∧ααα∧¬π∨&≡NW~α∞>F∂'↑5∩bα∞Mε*α
l⊗n/4↔⊗*∧∞G↔.l<↔&.D∧π&z∧∞6}nT
⊗oεL]V.wL≡FN}eQPRα∧∧ααα∧∧αε&↑Vv&]nBεw]\&/∩
|bε≡≡&∞∨L↑'~b∞>V≡B≡2β"
}"β*aQ hPQ&∩sBf$α¬&≥\PhPQ!PPh!Q hU≤v*β5V∪βα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧αααα62k
g¬c
α∧∧ααα∧∧ααα∧∧ααα∧∧α∧&\<Vn⊗↑$β2bε↔∪;8Q bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α¬&T¬∨O>LVjα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hW.]g&N\Tααα∧∧ααα∧∧αα¬:X%∩εmtε∂⊗}1PPh$∧ααα∧∧ααα¬∞'.wM≥V*J∞,W'/-n2ε∂4∩ε6∨
g.j∧∞FF*
nVn⊗↑$ε}2
]⊗∨⊗}<V≡}lN2ε}d∧ε∨πT∞FNnQQ"αα∧∧ααα∧∧π/≡\Dπ≡zl↔∩ε/∀π&FT∧ππ⊗|<W∨~
≥bπ>
≤6B∧I~5αε≡4π↔.mm⊗v:d∧α¬&Tε&NllW⊗.l<PhR∧∧ααα∧∧ααε,↑G>.]dπ'>t∧π6∞N\W~ε|dαG↔]nFNnU∀αεNlM⊗≡∂L↑2π&Tε∞n}]g"α
|bε≡⎇↑π/&≡M⊗}pQ$ααα∧∧ααα∧∞FF∂D∞v∂~Mvv*,W'>\]bπ&Tπ'>t6∞fN4π&z∞.Vw&≥\Rph!Q hWM≥V*α∧∧ααα∧∧ααα∧∧αα¬:X%∩εmtε∂⊗}1PPh$∧ααα∧∧ααα¬∞FNnU∀π⊗/N↑&w~∞Mε*πM≥V*ε≥dπ≡.=⎇f'~∧∞FF∂D∞FF*∞?↔∨&]TεF∂4&..d∞Wαb∧↔~ε⊃Q"αα∧∧ααα∧∧ε6f⎇nVjr∧∧¬&FTFN6l↑&.v<Tαε⊗↑Nv..d∧π&FT∞&/∨]NG~α
|bπ'⎇tαε≡≥MG~α∞Mrπ&≥\PhR∧∧ααα∧∧ααε≥lFN≡≡LW~α∧∞FF*∧∧ε∞n}]g"α
|bαα]F∂π<\Bαα∞,V∞b∧∞FNnUdααα¬ ⊗rα∧∞FF*∧ ∃%_Q$ααα∧∧ααα∧
⊗oεL]V.wL≡FN}eDπ&N\Tπ&F≡Dε.f≡∞6/~∧∞vFNLTπ&FT∞7O∨L]RεO4∞7&␈∞V"αNV*πMqPRα∧∧ααα∧∧αεn]]w↔J↑'⊗␈.4εO~
mw"α=vw≡≤LW⊗.D∧'⊗.≥D"ε∞lDεv␈D6␈.nLV"r∧∧¬/≡T¬π∨&≡NW_h$∧ααα∧∧αααL↔O&≥\RJπMtεn.≡>W⊗*∞N'.*∧.&.∞D∞v␈⊗LD"π&≥\RrHQ!PPh.=F./∧∧ααα∧∧ααα∧∧ααα
:T∃∩ε∀ε∂⊗qQ hR∧∧ααα∧∧ααα∞=F./∧
bJε<≡W≡/4∧ε
π,\⊗boM≥V*εL]F∂J
|bαεd∞6.≡⎇lG~b∞Mε.r∞,W'/-n2αεedαεpQ$ααα∧∧ααα∧
V∂J,Rε
m↔Fw]Tε␈∩∀ε6f⎇nVjpQ!PPh*<V*ε≥N6zπMRε∞L≡&n≡M|6Zεn]f∨&≥⎇bbπ<\7&N⎇dβ
sEf2bε≥lBπ&Tε&∂LUBε&∨≡FNnUDαε∞lDε&␈qQ&7.l>FN}n4ε}2∞Mε*π>L↔'/4∞7ε.=≤⊗bεm}&jbLW≡∨-≤&."
≥bπ&Tππ⊗\<V&Nltπ≡.>M⊗}raQ hPQ&∩sBf4α∧/<<↔εNltε7⊗⎇T∧dM:↓PPh!Q"αα ≡BεO4∞ε␈∨=≤&f*∞Mrαε↑<6∂εT∞F.o
}&∂⊗≥O∩ε7-⎇R∧d~:ααπMtε/F\>W&*∀ε≡}]\⊗v"∧
⊗rπMPhV
}7"α
}ε/⊗≡M⊗v:∞?↔∨&]Ubαα |bε≡}↑'≡*D∧π&FT∞π⊗}},⊗jα¬
w∩π↑<W∩J∧∞FF∂D∧π∨/∞
FN/4∞FF(Q,6}n\≥f"ε≡2απMtε↑v}tπ>F≤=ααε}W⊗∂M≥f:π?≡7&.T∧εO"
≡2π↔]mfNvt∧π.vL↑"rα ≡Bαε≡4ε∞g=qPWε}>6N⊗LTε6␈$∧∧dM:∧π&z∧∞&/'↑-bπε↑-V∞v]nFgJ∧∞FzπMRαε
}7"ε}W⊗∂M≥f:α∞?↔∨&]Ubα¬M
↔_h,M↔≡≡≡,G~πMR∧d~:αε.nm↔⊗}m\Vw"≥f"ε⎇≡f/~,⊗≡Z∞⎇ε∂&↑lW∩π,↑6␈/,<W~b∞>V≡B≡2εn]]w↔JAQ&O"∞|↔~π↑=⊗v:aQ hPQ!PPh!Q hPQ(F.≡]\&/∩εeBβ⊗vrαα∧∧ααα∧∧ααα∧∧ααα∧∧↓≠~V∃cBs$∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧
ε∞>Tε2kε⊃PPbR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧ V∞≡M≡7α¬,\f/⊗]l6*∧\≥g.∞D∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀jE"Ph!Q hR∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααε≥dπ&FT W.gM≤7~ε≥↑εf.\]g&∂M≥vph!Q&≡f≥lRαα∧∧ααα∧∧ααα∧∧¬≥,*$β
ε≡,phPQ$ααα∧∧ααα=FNvT∂αJb∞⎇ε/⊗T∂αεO4∩ε≡≡&∞∨L↑"π∨N-⊗v:DWF.>↑F/~∞Mε*∧↑]G&N>4ε≡}]\⊗v"∂↓PRα∧∧αε∞lDπ⊗/N↑&w~
m⊗br∧λWF∞↑
F+PQ$ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧¬ε≡f≥lRα↔⎇
rαnM⎇f:∩
quit SUBR no args
(quit) returns from the LISP command, freeing up the temporary segments
that were used to hold the LISP environment.
in the ITS implementation
valret LSUBR 0 or 1 args
(valret) does a .LOGOUT if LISP is a top level procedure, and otherwise
valrets ":VK " to DDT.
(valret x) effectively performs an explodec on x (in practice x is some
strange atomic symbol like |:PROCEED :DISOWN | , but it may be any S-
expression), If the string of characterq is one of "$↑X.", ":KILL ", or
":KILL↑M" then valret perforis a "silent kill by executine a ,¬¬%¬⊗~∀@@@@bXXd``@`vA←QQKeo%g@∃β63K↔ βC↔K4{C /4∧ε
αh¬P)J1+λ]=Z3LT≥~→$∧_z_.8⎇→.∧≤⎇≤M≥Yc"D∧λλλ∞MβP""∃⊂:7P→{0v*Xz2P0\P1w`-mafds, α
EXampl@∃`
hQ!PBα∧∧ααα∧¬π6∞L,W"α␈G%¬∀x8T,"¬(DM≤zybπbα#"AQHλλ∧∧λλλ∞>_8]∞∀≥~→$ ∩4t∧∞];[M≥Yh∪md~=≤d
⎇{@⊂≥tz47]z⊂0@≥2y6t[0p.
λ ∀@@@@@@QmC1`↔Qα;q↓j\J21↓U"⊗∞≡tkq$Q!PBα∧∧ααα∧
6NfN4π&FT DM≥∧λ⊗v"∞:F∂↔L4π/α⊂¬$9u`hPβ"H∧∧λλλ∧∧
≥X-NY=⊂ X∩'α∀∀@
λ Cause@LA↓ (↓iP≥β¬∪';Q∧¬w/"∧
FF*8mn→;]∞P7s⊂_v6⊂'≠w⊗⎇2\αo lOcati@=]f@AαK9αI~5HαHλ∧∧λ_;LD≥~→-d≤Y5∞↑Xπ⊂*≠P ISP.
αPaga #-102 ∪3)1.`X M↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓α∪,≠↔7,ε"β2Dε∪K≠qQ bR(J$5E%"αα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧α¬&T¬∨O>LVjα∧∧ααα∧∧ααα∧∧ααα∧∧ααα∧∧ααα%(E∀j@
E!"C"AQHλλ∧∧λλλ ≤β⊂:4→P⊂;0[92z_wvvp[2⊂⊂6→p{2iH<wzP~w⊂⊂"⊃*⊂∀7\⊂⊂0w≡{t2y→P7z4→y⊂⊂:~0w⊂:~2FE⊂λ⊂⊂⊂&∩ih∀Vλ0P∃!Sg*$g∃bP7`2 $P command to D@ (A]SYXAIKike8Ai↑AQQJA→%' XA]QSGP↓oSYX4∀@@@AiQK8AeKiUe\AMI←ZAi!JAGC1XAi↑↓mCYe∃h\@A!←oKm∃dXAm¬YeKh↓ISMM∃ef@A→a←ZAMkgaK9H~∀@@@AS8Aio↑↓oCsfh@ASh↓I←Kf↓]←hA
QKGVAM←d↓←aK\↓MSYKLXAC]⊂AShA⊃←KfA9←h@A¬YiKd↓iQJ~(@@@@↓giCeQS]NA¬IIeKMfA←L↓iQJA1∪' \A∪LAe←jAkMJAmC1eKhAQ↑AIk5`AB@↓gkEgegiKZ0AiQK8~∀@@@Agi¬eiS]≤Ak`AQQJAgUEgsgQKZAG¬kgKfABAe∃ike\↓i↑Ai=`AYKYKXAC9H@Ai!JAG←9gKck∃]h~∀@@@A∃mCYk¬iS←\↓←LAi!JAi←@[YKm∃XAKeIYSgh@Q]←PAiQJ↓ES]I%]NA←_AKee1Sgh@↓S\AK→MKGh4∀@@@AChAQQJAi%[JA←_AiQJAmCYIKhBR8@A+g%]NAgUgaK]⊂XAiQ∀AgkEMsgiK4@Agi¬eik`↓[KeK1r~∀@@@AG¬kgKf↓BAeKQke\A→e←ZAQQJAgUgaK]⊂AMk]
iS←\8~∀~∀4∀@@@@@@@@@@@@@@@@@@@AS\AQQJA)=!&Zb@AS[a1K[K]QCiS←8~∀~∀@@@@@A)Q∃eJASLAGkeIK]iYd@A]↑↓oCrA→←d@A1∪' AQ↑AeKQke\@↓BAG←5[C]H↓gieS9N@Ai<AiQJ4∀@@@A≠←]%i←d@↓S\@AQQJ@AQ∨!&ZD`AS[AYK[K9iCiS=\\@@↓⊃←oKYKdX@QmCYIKhR@↓oSYX↓eKikI\~∀@@@AG=]ie←0Ai↑AQQJA[=]Si←HAg↑AQQChA∧AG←[5C]HA5CrAE∀A[C]UCYYr↓isaK⊂\@@AQQK\AQsaJ~(@@@@↓π∨≥)%≥+
AQ↑AeKMk[JA1∪' \4∀~∀@@@@@A)QJAeK[¬eWf@↓CE←m∀@ACE=kh@AYCYeKP@AC]⊂@AgkMaK]HAQ←Y⊂@AM←H@AiQ∀A)∨!LZb`~(@@@@↓S[aY∃[K]i¬iS←\↓CYg↑8~∀~∀4∀b\p8h@Aβ⊃ISiS=]CXA→k]Gi%←]f~(~∀~∃MkEd@@@@@@@@@@@@AM+¬$@DACeN4∀~∀@@@@@A)QJ↓CeOk5K]hX↓BAMSa]kZX↓SfAi¬WK\AQ↑AEJ↓iQJA¬IIeKMfA←L↓B@AY=GCiS=\AoSQQS\~(@@@@↓BAG←5aSYK⊂A←dAMsgiK4AMk]
iS←\8@Agk dACiQK[aiLAi↑A⊃KiKe5S]JAQQJA]¬[J@A=LAiQ∀~∀@@@AMk9GiS←8@AErAOe←YKYS]≤AiQe=kOP@↓iQJ@↓Gkee∃]hA← CeeCd@AY←=WS]NACh@↓CYXAQQJ~∀@@@A
←[aS1KHAMU]GiS=\Aae=aKei%Kf\@↓∪LASPAMCS1fASh↓eKikI]f@D|D\@AQQSfA%fAkg∃HAEr4∀@@@AECWQeCGJ0AM←d↓KqC[AYJ\@A)QSLAMk]
iS←\↓[CrA J@AkMKMkX↓i↑AkMKd@A!C]IY∃efAM=d~∀@@@Ai!JA[C
QS]J5Kee←HAS]i∃eekaPXAM←HAKqC5aYJ\4∀@@@@@@@A)QJ↓M←YY=oS]N↓Mk]GQS←\A∃qSgiLA←]YdAS\AQQJA∪Q&AS[AYK[K9iCiS=\~∀~)gsgG¬YX@@@@@@@@@@↓→'+¬H@dAi<@b`A¬eOf~(~∀@@@@@@↓)QSf↓Mk]GQS←\A¬YY←oLAiQJ↓→∪' ↓kgKd↓i↑AI%eKGi1rASgMkJA∪Q&Ags5E←YSAgsgQKZ~∀@@@A
CYYf8@A)Q∀AMSeMhACe≥k[K]PAgQ←UYHAE∀~∀@@@@@@@@@@@@@@@@@@@@@@@@@P,@QYg AF@b`\RA\$~∀~∀@@@@@AoQ∃eJA\↓SfAi!JAIKMSeKH↓]k[E∃dA←L↓←kiaUhAmC1kKfA¬]HAF↓SfAi!JAG←9ie←X↓ESif4∀~∀~) KGK5EKd@XX@br\n@@@@@@@@@@@@@@@@&fZD\p\f@@@@@@@@@@@@@@@@@@@@↓!COJfZb`L~∀_TU Iβ
(T(@@@@@@@@@@@@@@@A5CGYSM`A%K→KeK]
JA≠C9kCX@@@@@@@@@@@@@@@TU⊃%β
((T~∀~(~∀@@@AM←HAiQJ↓GCYX8@A)Q∀AgKG=]H@A¬eOk[∃]hAg!←kYH↓EJAC8ACi←5SFAge[E←XAoQ←MJAa]¬[J~∀@@@A%fAiQ∀A]C[∀A←L@↓iQJA%)&AgegiKZ↓GCYX8@A)Q∀@AeKMhA←L↓iQJA¬eOk[∃]if@↓gQ←k1HAEJ4∀@@@AiQJ↓S]akPACeOU[K]iLAM←d↓iQJA
CYX\@Aβ\↓CeOk5K]hA5CrAE∀ABAM%q]kZ0A←d@↓BAMS1J~∀@@@A← UKGh@QM←H@AoQ%GP@AQQJ@A→SYJOLAGQC9]KX@↓]k[E∃d@ASL@Akg∃HR\@A∪L@↓iQJA
CYX~(@@@@↓gkGG∃KIfX↓BAYSMh@A←_A\AM%q]k[L@ASf↓eKikI]KH\A∪L@↓C\AKIe←dA=GGkeLX@Ai!JA∪)L~∀@@@AKeI←dAG=IJASLAeKiUe]KH↓CfAB↓MSq]UZ\~∀4∀@@@@@@A∃qC[a1Jt@@Qgsg
CYX@@@OgG5XAis$@fR~(@@@@@@@@@@Ag∃ifAi!JA]k5EKdA=LAKG!↑AYS9Kf@A→←dAi!JAiidAi↑@LAC]H↓eKikI]f@A9SXA←8~∀@@@@@@@@@@↓gkGG∃gf\~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∃!¬OJ@f4b`h@@@@@@@@@@@@@@@@@@@@@LfZb\`\h@@@@@@@@@@@@@@@A K
K[EKH@lX@Drnn~(_TU Iβ
(T(@@@@@@@@@@@@@@@@@@@@↓
k]GQS←\A%]IKp@@@@@@@@@@@@@@@@@@TU⊃%β
((T~∀~)]C[J$∪aCO∀∪isa∀~∀T∩$b`d∪1'+¬$`A←d↓[←eJ↓CeOf4∀TH∩$b`j∪1'+¬$`A←d↓[←eJ↓CeOf4∀UCeICr∩∩Ddd∪→M+¬$@LA←dA5←eJA¬eOf~(UISL$∩b``%'+¬$dACe≥f~∀U→k]Gi%←\∩f\∪
'+ $~∀UEk↑∩∩D`b∪'U¬$@d↓CeOf4∀UeK¬eeCr$bdf∪1'+¬$bA←d↓[←eJ↓CeOf4∀Ueg∃h∩∩bX`∪'+ $@bA¬eN~∀)egKh$∩bl`%'/∪)
⊂~∀V$∩b`d%→'+¬H@`A←HA[←e∀ACeOL~∀VH$∩b`j%→'+¬H@`A←HA[←e∀ACeOL~∀Z∩$b`d∪1'+¬$`A←d↓[←eJ↓CeOf4∀ZH∩$b`j∪1'+¬$`A←d↓[←eJ↓CeOf4∀↑∩∩D`f∪→M+¬$@@A←dA5←eJA¬eOf~(↑H∩∩D`l∪→M+¬$@@A←dA5←eJA¬eOf~(bV∩∩D`f∪'U¬$@b↓CeN~(bVH∩$b`l∪M+¬$@DACeN4∀bZ∩$b`f∪M+¬$@DACeN4∀bZH$∩b`l%'+¬$bACe≤~∀x∩$rl∪'U¬$@d↓CeOf4∀z∩∩dj∪'+ $@dA¬eOf~(|∩∩rT∪'+¬H@dACIOf~∃p∩∩b`L∪'+¬H@dACIOf~∃q8∩∩b@f∪'+ $@dA¬eOf~)<∩∩b@h∪'+ $@dA¬eOf~)<H∩∩D`l∪'U¬$@d↓CeOf4∃=H∩$brd∪M/∪)π ~∃=N$∩bhh%'+¬$`ACe≥f~∃C f∩∩r\∪'+¬H@bACIN~∃C⊃Hb∩∩D``∪'U¬$@b↓CeN~)CYCe5GY←G,∩bhr%'+¬$dACe≥f~∃C1Y←F∩$brj∪M+¬$@DACeN4∃CYa!CYKgM`∩ph%'+¬$dACe≥f~∃C9H∩∩lP∪
'+ $~∃CAaK]H$∩hn∪1'+¬$`A←d↓[←eJ↓CeOf4∃Caa40 SUBR 1 arg
args 91 LSUBR 1 or 2 args
array 122 FSUBR
arraycall 42 FSUBR
arraydims 123 SUBR 1 arg
ascii 113 SUBR 1 arg
assoc 56 SUBR 2 args
assq 57 SUBR 2 args
atan 108 SUBR 2 args
atom 29 SUBR 1 arg
baklist 161 LSUBR 0 to 1 arg
baktrace 161 LSUBR 0 to 2 args
baktrace1 165 LSUBR 0 to 2 args
baktrace2 165 LSUBR 0 to 2 args
bigp 29 SUBR 1 arg
boole 110 LSUBR 3 or more args
boundp 79 SUBR 1 arg
break 136 FSUBR
c...r 44 SUBR 1 arg
car 43 SUBR 1 arg
car 43 SWITCH
catch 72 FSUBR
catenate 117 LSUBR 0 or more args
cdr 43 SUBR 1 arg
cdr 43 SWITCH
cline 233 SUBR 1 arg
comment 38 FSUBR
cond 64 FSUBR
cons 44 SUBR 2 args
copysymbol 87 SUBR 2 args
cos 108 SUBR 1 arg
cxr 62 SUBR 2 args
defprop 83 FSUBR
defun 89 FSUBR
delete 54 LSUBR 2 or 3 args
delq 55 LSUBR 2 or 3 args
difference 99 LSUBR 1 or more args
do 67 FSUBR
dumparrays 125 SUBR 2 args
eq 31 SUBR 2 args
equal 31 SUBR 2 args
err 75 FSUBR
errframe 161 SUBR 1 arg
error 74 LSUBR 0 to 3 args
errprint 162 LSUBR 1 to 2 args
errset 74 FSUBR
eval 35 LSUBR 1 or 2 args
evalframe 162 SUBR 1 arg
evalhook 163 LSUBR 2 or 3 args
exp 107 SUBR 1 arg
explode 115 SUBR 1 arg
explodec 115 SUBR 1 arg
exploden 115 SUBR 1 arg
expt 100 SUBR 2 args
fillarray 124 SUBR 2 args
fix 97 SUBR 1 arg
fixp 29 SUBR 1 arg
flatc 116 SUBR 1 arg
flatsize 115 SUBR 1 arg
float 97 SUBR 1 arg
floatp 29 SUBR 1 arg
freturn 163 SUBR 2 args
fsc 112 SUBR 2 args
funcall 41 LSUBR 1 or more args
function 36 FSUBR
gc 191 FSUBR
gcd 100 SUBR 2 args
gctwa 191 FSUBR
gensym 87 LSUBR 0 or 1 args
get 81 SUBR 2 args
get←pname 118 SUBR 1 arg
getchar 113 SUBR 2 args
getcharn 114 SUBR 2 args
getl 81 SUBR 2 args
getsp 206 LSUBR 1 to 2 args
go 70 FSUBR
greaterp 95 LSUBR 2 or more args
haipart 98 SUBR 2 args
haulong 94 SUBR 1 arg
hunk 61 LSUBR 0 or more args
hunkp 30 SUBR 1 arg
hunksize 62 SUBR 1 arg
ifix 97 SUBR 1 arg
implode 114 SUBR 1 arg
index 117 SUBR 2 args
intern 87 SUBR 1 arg
ioc 144 FSUBR
iog 145 FSUBR
last 46 SUBR 1 arg
length 46 SUBR 1 arg
lessp 95 LSUBR 2 or more args
list 47 LSUBR 0 or more args
listarray 124 LSUBR 1 or 2 args
listify 41 SUBR 1 arg
loadarrays 125 SUBR 1 arg
log 107 SUBR 1 arg
lsh 111 SUBR 2 args
lsubrcall 42 FSUBR
make←atom 118 SUBR 1 arg
makhunk 62 SUBR 1 arg
maknam 114 SUBR 1 arg
maknum 58 SUBR 1 arg
makunbound 79 SUBR 1 arg
mapatoms 129 LSUBR 1 or 2 args
max 96 LSUBR 1 or more args
member 53 SUBR 2 args
memq 54 SUBR 2 args
min 96 LSUBR 1 or more args
minus 98 SUBR 1 arg
minusp 93 SUBR 1 arg
munkam 58 SUBR 1 arg
nconc 48 LSUBR 0 or more args
ncons 45 SUBR 1 arg
nointerrupt 150 SUBR 1 arg
not 32 SUBR 1 arg
nouuo 160 SUBR 1 arg
nouuo 160 SWITCH
nreconc 49 SUBR 2 args
nreverse 49 SUBR 1 arg
null 32 SUBR 1 arg
numberp 30 SUBR 1 arg
oddp 93 SUBR 1 arg
or 64 FSUBR
pagebporg 206 SUBR no args
plist 83 SUBR 1 arg
plus 99 LSUBR 0 or more args
plusp 93 SUBR 1 arg
pnget 85 SUBR 2 args
pnput 85 SUBR 2 args
prog 66 FSUBR
prog2 38 LSUBR 2 or more args
progn 39 LSUBR 1 or more args
progv 39 FSUBR
purcopy 205 SUBR 1 arg
purify 206 SUBR 3 args
putprop 82 SUBR 3 args
quit 233 SUBR no args
quote 35 FSUBR
quotient 99 LSUBR 1 or more args
random 109 LSUBR 0 to 2 args
readlist 114 SUBR 1 arg
remainder 100 SUBR 2 args
remob 87 SUBR 1 arg
remprop 83 SUBR 2 args
return 71 SUBR 1 arg
reverse 48 SUBR 1 arg
rot 111 SUBR 2 args
rplaca 51 SUBR 2 args
rplacd 51 SUBR 2 args
rplacx 62 SUBR 3 args
runtime 232 SUBR no args
samepnamep 84 SUBR 2 args
sassoc 57 SUBR 3 args
sassq 58 SUBR 3 args
save 202 FSUBR
sat 78 SUBR 2 args
setarg 40 SUBR 2 Args
satplist 83 SUBR 2 args
satq 77 FSUBR
signp 94 FSUBR
cin 108 SUBR 1 Arg
sleep 232 SUBR 1 arg
soRt 59 SUBR 2 args
sortcar 60 SUBR 2 args
sqrt 107 SUBR 1 arg
sstatus 210 FSUBR
status 210 FSUBR
store 123 FSUBR
stringlength 117 SUBR 1 arg
stringp 30 SUBR 1 arg
sub1 100 SUBR 1 arg
sublis 52 SUBR 2 args
subr 234 SUBR 1 arg
subrcall 41 FSUBR
subrp 30 SUBR 1 arg
subst 52 SUBR 3 args
substr 118 LSUBR 2 or 3 args
suspend 202 LSUBR 0 to 2 args
sxhash 55 SUBR 1 arg
symbolp 29 SUBR 1 arg
symeval 78 SUBR 1 arg
syscall 234 LSUBR 2 to 10 args
sysp 91 SUBR 1 arg
throw 73 FSUBR
time 232 SUBR no args
times 99 LSUBR 0 or more args
typep 30 SUBR 1 arg
valret 233 LSUBR 0 or 1 args
xcons 45 SUBR 2 args
zerop 93 SUBR 1 arg
zunderflow 109 SWITCH